【问题标题】:Why doesn't printf "${array[@]}\n" print all elements of my array?为什么 printf "${array[@]}\n" 不打印我的数组的所有元素?
【发布时间】:2017-04-16 18:40:50
【问题描述】:

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

【问题讨论】:

  • bash 不是 ksh
  • 正如 Cyrus 所说——bash 标记不应用于仅在 ksh 中有效的代码的问题。
  • 感谢 Cyrus 和 Charles 的反馈,我被错误地给予了 bash。

标签: unix ksh


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多