Bash 脚本中的工作原理如下:
PACKAGES=(
'curl'
'git'
'htop'
'mc'
'tree'
'vim'
)
apt --yes install ${PACKAGES[@]}
但是我怎样才能在 POSIX 中做同样的事情,以便我可以在#!/bin/sh
脚本中使用它呢?
答案1
在 POSIX sh
shell 中,只有一个数组:($@
位置参数数组,即$1
, $2
, ...)。您可以使用以下命令设置其值set
:
set -- curl git htop mc tree vim
或从命令行:
./myscript.sh curl git htop mc tree vim
然后,
apt --yes install "$@"
引用 的扩展$@
使数组扩展至其引元素。也就是说,如果$@
数组包含a word
和another word
,"$@"
将扩展到那些二字符串。不引用$@
将使其扩展到四字符串a
、word
、another
和word
。未引用的行为取决于 的内容$IFS
。
请注意,在bash
太中,您需要双引号${PACKAGES[@]}
扩展:
apt --yes install "${PACKAGES[@]}"
你不真的不过,这里“用空格连接元素”。是的,如果你的echo
值你会在它们之间得到空格,但这是之间的区别
set -- a b c d
printf '>%s<\n' "$@"
这产生
>a<
>b<
>c<
>d<
(四个单独的参数,这就是你想要的)
和
printf '>%s<' "$*"
这产生
>a b c d<
(一个带有元素的参数由空格连接( 的第一个字符$IFS
,这不是您实际想要在apt install
命令中使用的字符)
答案2
由于您拥有的是包名称,因此如果您想使用标准 shell,您可以将它们存储在一个简单的字符串变量中。至少根据 Debian 手册,包名称只能包含字符-+.:~a-z0-9A-Z
,其中没有一个是全局字符或空格。
所以,这应该没问题:
#!/bin/sh
packages="curl git htop ..."
IFS=" " # make sure there's nothing weird here
apt --yes install $packages # no quotes!
如果您很偏执,请添加set -f
到开头以禁用文件名通配。这只会留下空格作为问题,但我认为任何理智的系统都不会允许包名称中出现空格。