Eu não acho que você queira dar aspas simples para gtar
. Em um comando como somecmd 'foo bar' 'files*.log'
, o shell manipulará as aspas, informando que ele não trata caracteres especiais especialmente e passa somecmd
dos argumentos foo bar
e files*.log
. Os programas Unix não obtêm a linha de comando como uma string, mas um número de strings de argumentos, é o shell que faz a divisão da linha de comando em strings.
Se você quiser read
de vários valores no Bash, você pode usar read -a array
e, em seguida, entregar a matriz ao comando.
-a array assign the words read to sequential indices of the array
variable ARRAY, starting at zero
ou seja,
read -a filenames
gtar "${filenames[@]}"
A indexação da matriz com [@]
(entre aspas) se expande para os membros da matriz como palavras separadas, que é o que você deseja.
Além disso, você tem for file in ${GTAR[*]}
. Isso parece acessar GTAR
como uma matriz, mas não é uma, você acabou de atribuir a saída do comando gtar
a ela, como uma string. Nesse caso, ${GTAR[*]}
é o mesmo que $GTAR
. Como a expansão não é citada, a string passa por uma divisão de palavras nesse ponto, que por padrão se divide em espaços em branco. Mas, depois disso, as palavras são também consideradas como globs de nome de arquivo e expandidas para nomes de arquivos correspondentes.
Contanto que seus nomes de arquivos não contenham espaços em branco ou caracteres glob ( *?[]
, tudo bem. Mas, em geral, não é algo que você queira fazer.
Para matrizes adequadas, você provavelmente sempre deseja usar "${array[@]}"
em vez de [*]
.
Veja: Divisão de palavras , Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais? e Matrizes