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 )