Em:
dirs="
$HOME/Documents
$HOME/Music
"
Você está atribuindo uma string (contendo espaços e caracteres de nova linha e quaisquer que sejam os caracteres $HOME
) a uma variável escalar ( $dirs
).
Em seguida, você deseja passar uma lista de diretórios para ls
, ou seja, vários argumentos. Então você precisa de alguma forma dividir essa string em uma lista de argumentos para passar para ls
. Como você vai dividir isso? Em espaços e novas linhas? E se $HOME
contiver espaços ou novas linhas?
As shells POSIX têm um operador de divisão, na verdade, elas têm um operador split + glob que você invoca deixando uma variável sem aspas. Por sorte, por padrão, a divisão é feita no espaço e na nova linha (e na guia). Então você poderia fazer:
IFS=' ''
' # space and newline
set -f # disable globbing as we want only the
# splitting part of the split+glob operator
ls -- $dirs
Mas aqui, como queremos uma lista, o melhor seria armazenar os elementos em uma variável do tipo lista, em vez de juntá-los em uma string apenas para dividi-la depois.
Cascas POSIX têm a matriz de parâmetros posicionais ( $1
, $2
...) para isso:
#! /bin/sh -
set -- ~/Documents ~/Music
ls -- "$@"
Ou se você não se importar em tornar seu script mais lento e menos portátil, use um shell com variáveis de matriz como bash
:
#! /bin/bash -
files=(
~/Documents
~/Music
)
ls -- "${files[@]}"
Ou zsh
:
#! /bin/zsh -
files=(
~/Documents
~/Music
)
ls -- $files