我确实了解以下脚本正在安装软件包,但我不明白是什么软件包:
for package in ${d[@]};
do
rpm -ivh --quiet ${!package} >/dev/null 2>&1
什么是${d[@]}
?
答案1
${d[@]}
表示 array 的所有元素d
。
这也意味着无论谁编写该脚本都没有防御性地编写它,因为他们不小心没有双引号它。 for循环应该写成:
for package in "${d[@]}";
这样, 的每个元素d
都会扩展为一个单独的单词(即 for 循环的参数),无论它包含什么。
如果没有双引号, 的元素d
将受到正常 shell 分词和扩展的影响(例如,其中包含空格的元素将被视为二for 循环的参数,不是一个)。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?以获得更详细的解释。
这在上下文中可能没问题(即,如果d
仅包含没有空格或其他 shell 元字符的包名称),但对于任何 shell 程序员来说都是一个坏习惯。
来自man bash
,在章节标题下Arrays
:
可以使用 引用数组的任何元素
${name[subscript]}
。需要使用大括号以避免与路径名扩展发生冲突。如果下标是
@
或*
,则该词将扩展到 name 的所有成员。仅当单词出现在双引号内时,这些下标才会有所不同。如果该词被双引号括起来,则
${name[*]}
扩展为一个字 每个数组成员的值由 IFS 特殊变量的第一个字符分隔,并将${name[@]}
name 的每个元素扩展为单独的词。当没有数组成员时,${name[@]}
将扩展为空。
(额外的换行符以提高可读性,并且我添加了一些粗体以强调重点)