最佳实践:在bash脚本中打印数组

8

我对我的脚本运行了 shellcheck, 发现一个非常简单的错误 -

echo "删除的字段列表:${deleted[@]}"
^-----------^ SC2145: 参数混合了字符串和数组。使用*或分开参数。

我尝试实现以下类似的行为 -

declare -a  deleted
deleted = ("some.id.1" "some.id.22" "some.id.333")
echo "List of fields deleted: ${deleted[@]}"

哪种打印数组元素的方式更好?
echo "List of fields deleted: ${deleted[@]}"

或者

echo "List of fields deleted: "
 for deletedField in "${deleted[@]}"; do echo "${deletedField}"; done
1个回答

16

在较长的字符串中包含一个@索引数组可能会产生一些奇怪的结果:

$ arr=(a b c)
$ printf '%s\n' "Hi there ${arr[@]}"
Hi there a
b
c
这是因为${arr[@]} 的引用展开成了一系列独立的单词,而printf会逐个使用这些单词。第一个单词a前面会加上Hi there(就像任何跟在数组后面的东西都会追加到c一样)。
当数组展开是较长字符串的一部分时,你几乎肯定希望展开成单个单词。
$ printf '%s\n' "Hi there ${arr[*]}"
Hi there a b c

使用 echo 命令时,这并不重要,因为您可能不关心 echo 是否接收一个或多个参数。


谢谢!那解决了我的疑惑。 - Poorva Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接