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



>我在一个名为 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

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

printf '%sn' "${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 ' - %sn' "${pwd_ids[@]}";或者在填充到 20 个空格的列中将两个打印到一行,printf '%20s%20sn' "${pwd_ids[@]}"


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

printf '%sn' "${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

为了解释上述所有内容:后续参数将替换为格式字符串中的占位符。在上面的第一种情况下,数组的每个元素都根据%sn进行评估,因此在其后立即添加一个换行符。

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

最新更新