>我在一个名为 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
),忽略这些参数的值。