2017-04-16 63 views
1

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

bash不是ksh – Cyrus

+0

正如赛勒斯所说 - bash标签不应该用于仅在ksh中有效的代码的问题。 –

+0

感谢Cyrus和Charles的反馈,我错误地给了bash。 –

回答

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),忽略这些参数的值。

相关问题