我使用的是 FreeBSD,shell 是“sh”。我想编写一个简单的脚本来安装软件包列表。通常,我会使用数组来存储软件包名称,但由于“sh”不支持数组,我认为最好的方法是使用空格分隔的字符串,如下所示:
packages="nameofpackage1 nameofpackage2 nameofpackage3"
这种方法的问题是,当我有很多包并且想按字母顺序排列它们时,稍后添加新包意味着我必须重新排列整个列表,同时还要记住每行 80 个字符。随着时间的推移,这会使结构更难管理。
我认为以“列表”布局列出软件包会更好。这样插入新软件包就更容易了,只需添加新行即可。但是,据我所知,这意味着我需要使用字符\
来继续行。如果有很多软件包,就会有很多\
字符。这会给 sh 带来任何问题吗?
packages="package_a \
package_b \
package_c \
package_d \
and so on"
有没有更好的方法?如果您有任何建议,我将不胜感激。
您的示例中的反斜杠是不必要的,因为无论如何您都需要让 shell 拆分字符串,并且默认情况下它会按空格、制表符和换行符拆分。因此,字符串中的换行符是否转义实际上并不重要。
将软件包列表降级为单个字符串的问题在于,要在循环中使用单个软件包名称或对它们执行任何操作,您必须(让 shell)通过不加引号来拆分字符串。现在,在软件包名称不包含空格或通配符的简单情况下,这可能没问题,但是一旦您需要处理类似
curl 8.*
或类似的子字符串,shell 的拆分和通配操作在所有情况下都很难正确完成。相反,使用位置参数列表:
然后您可以使用 引用该列表
"$@"
。您可以使用以下方式循环遍历包
或者,如果你喜欢打字,