Substitua aspas simples por strings divididas pelo espaço em branco da variável

2

Estou escrevendo um script bash no qual estou lendo uma variável por meio de read dessas duas strings:

log.*.console.log log.*.log

Eles estão separados por espaço.

Como posso reescrever as strings que a saída da variável para o próximo programa chamado no script as terá nesse formulário? 'log.*.console.log' 'log.*.log'

Eu estava tentando sed e awk mas de alguma forma sem sucesso.

O roteiro inteiro:

#!/bin/bash
if [ -z "$*" ] ; then
echo "USAGE: ./some text"
exit 1

else

echo "some text"
read varlogname

i=1
for file in $@
do
echo "Doing" $file
GTAR=$(gtar -xvf $file --wildcards --ignore-case --no-anchored "$varlogname")

for file in ${GTAR[*]}
do
mv $file $file"."${i}
i=$((i+1))
done
done
echo "Files extracted."
fi
exit 0
    
por DaWe4444 10.04.2017 / 10:10

1 resposta

5

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

    
por 10.04.2017 / 10:49