gpt4 book ai didi

arrays - printf '%s\n' "${array[@]}"每个数组元素打印一行是否正常?

转载 作者:行者123 更新时间:2023-12-05 08:33:30 25 4
gpt4 key购买 nike

在我的 bash 脚本中,我包含了程序所需的一系列其他文件。然后我在帮助描述中打印那些。当我使用 printf 作为他们的输出时,我得到了我意想不到的结果。我已经读到 ${array[@]} 形式通常被首选作为扩展的默认值,所以我从它开始。

我的数组声明:

 scriptDependencies=("script1.sh" "script2.sh")

和(初始)printf 命令:

printf "Dependencies: %s\n" "${scriptDependencies[@]}"

我得到的输出:

 Dependencies: script1.sh
Dependencies: script2.sh

虽然我相信我理解下标“@”和“*”之间的基本区别是所有单独的元素与所有组合在一起的元素,但我并不期望打印两行。

当我将 printf 命令切换为使用 ${scriptDependencies[*]} 形式时,打印了一行(更接近我想要的):

 Dependencies: script1.sh script2.sh

这是 printf 和下标的预期行为吗?还是表明 printf 有问题?

我使用的是 GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin15)。

最佳答案

这是记录在案的预期行为。如果传递给 printf 的字符串多于格式字符串可以处理的数量,则将重复该格式字符串。

"${array[@]}" 扩展为每个数组元素一个 shell 字。因此,对于具有两个元素的数组,将向 printf 传递两个参数;如果格式字符串只有一个占位符(只有一个%s),那么它会被重复。

相比之下,"${array[*]}"(带有引号!)将扩展为只有一个参数(带有 IFS 的第一个字符,一个默认情况下,在每个元素之间插入空格)。


POSIX specification 需要 Bash 来执行此操作,强调如下:

  1. The format operand shall be reused as often as necessary to satisfy the argument operands. Any extra c or s conversion specifiers shall be evaluated as if a null string argument were supplied; other extra conversion specifications shall be evaluated as if a zero argument were supplied. If the format operand contains no conversion specifications and argument operands are present, the results are unspecified.

因此,此行为可移植到所有 POSIX 兼容的 shell。

关于arrays - printf '%s\n' "${array[@]}"每个数组元素打印一行是否正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39690037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com