为什么不printf“$ {array [@]} \ n”打印我的数组的所有元素?

时间:2017-04-16 18:40:51

标签: unix ksh

我在一个名为pwd_ids的数组中有一些值,当我尝试使用printf打印所有值时,它只给出第一个元素,而尝试使用echo打印它会给出所有元素。这背后的原因是什么?以下给出了我的例子。

set -A pwd_ids  E.1.1.7 E.1.1.9 E.1.1.2 E.1.1.3 E.1.1.4 E.1.1.6 E.1.1.5 
echo "${pwd_ids[@]}"
printf "${pwd_ids[@]}\n"

输出:

 E.1.1.7 E.1.1.9 E.1.1.2 E.1.1.3 E.1.1.4 E.1.1.6 E.1.1.5
 E.1.1.7

1 个答案:

答案 0 :(得分:4)

printf的第一个参数是格式字符串。数据应仅在后续参数中传递。因此:

printf '%s\n' "${pwd_ids[@]}"

将正确发出:

E.1.1.7
E.1.1.9
E.1.1.2
E.1.1.3
E.1.1.4
E.1.1.6
E.1.1.5

也可以使用其他格式字符串;例如,您可以使用短划线打印您的项目:printf ' - %s\n' "${pwd_ids[@]}";或者将两行打印成一行填充到20个空格printf '%20s%20s\n' "${pwd_ids[@]}"

或者,要将值全部放在一行上,请在一个后续参数中传递它们:

printf '%s\n' "${pwd_ids[*]}"

使用输出(如果您的IFS变量是默认值或以空格开头):

E.1.1.7 E.1.1.9 E.1.1.2 E.1.1.3 E.1.1.4 E.1.1.6 E.1.1.5

解释以上所有内容:后续参数替换格式字符串中的占位符。在上面的第一种情况中,数组的每个元素都是针对%s\n进行评估的,因此在它之后会立即添加换行符。

在您的问题中,您将E.1.1.7作为格式字符串传递。这个格式字符串根本没有占位符,所以shell对它的作用是未定义的:在你的ksh版本中,它只打印格式字符串并忽略后续参数;在其他shell中,它可以为每个参数打印一次格式字符串(E1.1.7),忽略这些参数的值。