Resumo:
Uma solução segura de "expansão de nome de arquivo" (para my-script2):
IFS=' ' read -a arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo
A solução ingênua de usar a variável não cotada para dividi-la em palavras (com base no valor IFS) também expõe o conteúdo à expansão de nome de arquivo em *,? e [(pelo menos).
Esta string específica funciona corretamente:
$ set "a string with spaces"
$ printf '<%s>--' $1; echo
<a>--<string>--<with>--<spaces>--
Mas esta string falha claramente:
$ set "a bad * string with spaces"
$ printf '<%s>--' $1; echo
<a>--<bad>--<file1>--<file2>--<string>--<with>--<spaces>--
O asterisco foi expandido para os arquivos em PWD.
Here-doc
Uma maneira (muitas vezes negligenciada, mas também muito útil) de obter expansão de variáveis sem "expansão de nome de caminho" é usar um documento aqui.
IFS=' ' read -ra arr <<-_EOF_
$1
_EOF_
printf '<%s>--' "${arr[@]}" ; echo;
Como explicado no manual:
If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion, … …
Por favor, note que "expansão do nome do caminho" não é aplicada .
A prima de um documento aqui é a string here, que torna o código mais curto:
IFS=' ' read -ra arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo;
Lembre-se que (como entre aspas duplas) os caracteres \, $ e 'são especiais.
Do manual:
the character sequence \ is ignored, and \ must be used to quote the characters \, $, and '