如何在 POSIX 中连接由空格分隔的数组元素?

如何在 POSIX 中连接由空格分隔的数组元素?

Bash 脚本中的工作原理如下:

PACKAGES=(
    'curl'
    'git'
    'htop'
    'mc'
    'tree'
    'vim'
)

apt --yes install ${PACKAGES[@]}

但是我怎样才能在 POSIX 中做同样的事情,以便我可以在#!/bin/sh脚本中使用它呢?

答案1

在 POSIX shshell 中,只有一个数组:($@位置参数数组,即$1, $2, ...)。您可以使用以下命令设置其值set

set -- curl git htop mc tree vim

或从命令行:

./myscript.sh curl git htop mc tree vim

然后,

apt --yes install "$@"

引用 的扩展$@使数组扩展至其元素。也就是说,如果$@数组包含a wordanother word"$@"将扩展到那些字符串。不引用$@将使其扩展到字符串awordanotherword。未引用的行为取决于 的内容$IFS

请注意,在bash太中,您需要双引号${PACKAGES[@]}扩展:

apt --yes install "${PACKAGES[@]}"

有关的:Unix Bourne Shell 中的数组


你不真的不过,这里“用空格连接元素”。是的,如果你的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到开头以禁用文件名通配。这只会留下空格作为问题,但我认为任何理智的系统都不会允许包名称中出现空格。

相关内容