Em um shell POSIX sh
, você tem exatamente uma matriz: $@
(a matriz de parâmetros posicionais, ou seja, $1
, $2
, ...). Você define seus valores com set
:
set -- curl git htop mc tree vim
ou a partir da linha de comando:
./myscript.sh curl git htop mc tree vim
Então,
apt --yes install "$@"
Citando a expansão de $@
, a matriz é expandida para seus elementos citados . Ou seja, se a matriz $@
contiver a word
e another word
, "$@"
será expandido para essas sequências duas . Não citar $@
fará com que ela se expanda para as quatro strings a
, word
, another
e word
. O comportamento não cotado depende do conteúdo de $IFS
.
Observe que em bash
também, você gostaria de citar duas vezes a expansão ${PACKAGES[@]}
:
apt --yes install "${PACKAGES[@]}"
Relacionados: Matrizes no Unix Bourne Shell
Você não realmente "une os elementos com espaços" aqui. Sim, se você echo
os valores você terá espaços entre eles, mas é a diferença entre
set -- a b c d
printf '>%s<\n' "$@"
que produz
>a<
>b<
>c<
>d<
(quatro argumentos separados, que é o que você quer)
e
printf '>%s<' "$*"
que produz
>a b c d<
(um único argumento com os elementos unidos por espaços (o primeiro caractere de $IFS
), que não é o que você realmente quer usar com o comando apt install
)