Cascas POSIX têm um array: os parâmetros posicionais ( $1
, $2
, etc., coletivamente referenciados como "$@"
).
set -- 'foo/target/a.jar' 'foo/target/b.jar' 'bar/target/b.jar' 'bar/target/lol whitespace.jar'
set -- "$@" '/another/one at the end.jar'
…
for jar do
dostuffwith "$jar"
done
Isso é inconveniente porque existe apenas um, e destrói qualquer outro uso dos parâmetros posicionais. Os parâmetros posicionais são locais para uma função, o que às vezes é uma bênção e, às vezes, uma maldição.
Se os nomes dos seus arquivos não contiverem novas linhas, você poderá usar novas linhas como separador. Quando você expande a variável, primeiro desative a globbing com set -f
e defina a lista de caracteres de divisão de campo IFS
para conter apenas uma nova linha.
INPUT="foo/target/a.jar
foo/target/b.jar
bar/target/b.jar
bar/target/lol whitespace.jar"
…
set -f; IFS='
' # turn off variable value expansion except for splitting at newlines
for jar in $INPUT; do
set +f; unset IFS
dostuffwith "$jar" # restore globbing and field splitting at all whitespace
done
set +f; unset IFS # do it again in case $INPUT was empty
Com itens em sua lista separados por novas linhas, você pode usar muitos comandos de processamento de texto de maneira útil, em particular sort
.
Lembre-se de sempre colocar aspas duplas em torno das substituições de variáveis, exceto quando você deseja explicitamente que a divisão de campos ocorra (assim como globbing, a menos que você tenha desativado isso).