Estoy escribiendo un script bash donde leo una variable a través de read
estas dos cadenas:
log.*.console.log log.*.log
Están separados por el espacio.
¿Cómo puedo reescribir las cadenas que la salida de la variable para el siguiente programa llamado en el script tendrá en esta forma?'log.*.console.log' 'log.*.log'
Estaba probando sed y awk pero de alguna manera sin éxito.
El guión completo:
#!/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
Respuesta1
No creo que quieras poner comillas simples a gtar
. En un comando como somecmd 'foo bar' 'files*.log'
, el shell manejará las comillas, le indicará que no trate los caracteres especiales de manera especial y pasará somecmd
los argumentos foo bar
y files*.log
. Los programas Unix no obtienen la línea de comandos como una cadena, sino como una serie de cadenas de argumentos; es el shell el que divide la línea de comandos en cadenas.
Si desea read
varios valores en Bash, puede usar read -a array
y luego entregar la matriz al comando.
-a array assign the words read to sequential indices of the array
variable ARRAY, starting at zero
es decir
read -a filenames
gtar "${filenames[@]}"
La indexación de la matriz con [@]
(entre comillas) se expande a los miembros de la matriz como palabras separadas, que es lo que desea.
Además, tienes for file in ${GTAR[*]}
. Parece acceder GTAR
como una matriz, pero no lo es, simplemente le ha asignado la salida del gtar
comando, como una cadena. En este caso ${GTAR[*]}
es lo mismo que $GTAR
. Dado que la expansión no está entre comillas, la cadena se divide en palabras en este punto, lo que de forma predeterminada se divide en espacios en blanco. Pero, después de eso, las palabras sontambiéntomados como globos de nombres de archivos y expandidos a nombres de archivos coincidentes.
Siempre y cuando los nombres de sus archivos no contengan espacios en blanco o caracteres globales ( *?[]
, esto está bien. Pero en general, no es algo que desee hacer.
Para matrices adecuadas, probablemente siempre quieras usar "${array[@]}"
en lugar de [*]
.
Ver:División de palabras,¿Por qué mi script de shell se atasca con espacios en blanco u otros caracteres especiales?ymatrices