Estou escrevendo um script bash onde estou lendo uma variável por meio read
destas 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 somecmd
os argumentos foo bar
e 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 read
vários valores no Bash, você pode usar read -a array
e, 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 GTAR
como um array, mas não é, você apenas atribuiu a saída do gtar
comando 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