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

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

Estou escrevendo um script bash onde estou lendo uma variável por meio readdestas 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á neste formato?'log.*.console.log' 'log.*.log'

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

Todo o roteiro:

#!/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

Responder1

Eu não acho que você queira fornecer aspas simples para gtar. Em um comando como somecmd 'foo bar' 'files*.log', o shell irá lidar com as aspas, eles instruirão ele a não tratar caracteres especiais de maneira especial e passarão somecmdos argumentos foo bare files*.log. Os programas Unix não obtêm a linha de comando como uma string, mas uma série de strings de argumentos, é o shell que faz a divisão da linha de comando em strings.

Se você quiser readvários valores no Bash, você pode usar read -a arraye, em seguida, entregar o array 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[*]}. Parece acessar GTARcomo um array, mas não é, você apenas atribuiu a saída do gtarcomando a ele, como uma string. Neste caso ${GTAR[*]}é o mesmo que $GTAR. Como a expansão não está entre aspas, a string sofre divisão de palavras neste ponto, que por padrão é dividida em espaços em branco. Mas, depois disso, as palavras sãotambémtomados como globs de nomes de arquivos e expandidos 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 desejará usar "${array[@]}"em vez de [*].

Ver:Divisão de palavras,Por que meu script de shell engasga com espaços em branco ou outros caracteres especiais?eMatrizes

informação relacionada