2016-09-25 48 views
0

在我的bash脚本中,我包含了该程序所需的其他文件的数组。然后我在帮助说明中打印这些内容。当我使用printf输出时,我得到了我没有想到的结果。我已经读过,$ {array [@]}形式通常是首选的扩展名默认,所以我从这开始。

我的数组声明:

scriptDependencies=("script1.sh" "script2.sh") 

而且(初始)printf命令:

printf "Dependencies: %s\n" "${scriptDependencies[@]}" 

我有什么作为输出:

Dependencies: script1.sh 
Dependencies: script2.sh 

虽然我相信我明白一个基本下标'@'和'*'之间的区别是所有单个元素与所有元素组合在一起,我不是期待打印两条单独的线。

当我切换printf命令使用$ {scriptDependencies [*]}形式,单个线(接近我需要的话)被印:

Dependencies: script1.sh script2.sh 

是printf的这一预期的行为,并的下标?还是它指向printf的问题?

我正在使用GNU bash,版本3.2.57(1)-release(x86_64-apple-darwin15)。

+0

如果您想以明确的形式打印数组的内容,请考虑:'printf'Dependencies:'; printf'%q'“$ {scriptDependencies [@]}”; printf'\ n'' - 写的更多,但它意味着'array =(“foo bar”)'和'array =(foo bar)'每个都有不同的输出 - 并且'array =($' foo \ nbar')'同样会得到理智的处理。 –

+0

如果你不关心格式化控制,你也可以使用'declare -p scriptDependencies' –

+0

也许我应该把这个聊天?我不是(迄今)能够围绕你的任何评论包裹我的小脑袋,但我已经测试了两者。对于%q格式,我在依赖项数组中包含的一个字符串包含“(v2)”。当我使用%q时,空格和对角线都添加了escape seq。我不明白是什么使得这些毫不含糊? declare -p scriptDependencies的输出结果如下:declare -a scriptDependencies ='([0] =“script1.sh”[1] =“script2.sh”)'我得到你提到这些是因为有善良,但我不明白。这么多的时间来学习,这么短的时间:) –

回答

6

这是记录和预期的行为。如果传递给printf的字符串数多于格式字符串可以处理的字符串数,那么将重复该格式字符串。

"${array[@]}"扩展为每个数组元素的shell字。因此,对于具有两个元素的数组,将传递printf的两个参数;如果格式字符串只有一个占位符(只有一个%s),那么它将被重复。

相比之下,"${array[*]}"(带引号!)将扩展为只有一个参数(第一个字符IFS,默认情况下,在每个元素之间插入一个空格)。


击要求通过POSIX specification做到这一点,加入以下重点:

  • 格式操作数应当被重用尽可能经常需要满足参数操作数。任何额外的c或s转换说明符应被评估,就像提供了空字符串参数一样;应评估其他额外的转换规格,就像提供零参数一样。如果格式操作数不包含转换规范,并且参数存在操作数,则结果未指定。
  • 因此,此行为适用于所有符合POSIX标准的外壳。

    2

    这是预期的:从help printf

    格式重新根据需要使用以消耗所有的参数。如果 的参数比格式要求的参数更少,则额外格式 规范的行为就像提供了零值或空字符串(如果适当),即 已提供。

    +0

    非常酷。在我的系统中,printf没有描述这一点,但手册页说基本上是一样的。但是,我不确定如果没有亲身体验过这种行为,我会理解那是什么意思。现在我正在查看选项,以在单行依赖关系之后在单行中打印每个依赖项,而不用单行输入。 –

    相关问题