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