通过脚本安装包

通过脚本安装包

我确实了解以下脚本正在安装软件包,但我不明白是什么软件包:

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[@]} 将扩展为空。

(额外的换行符以提高可读性,并且我添加了一些粗体以强调重点)

相关内容