Las comillas se eliminan antes de que los argumentos pasen a su secuencia de comandos, por lo que es demasiado tarde para conservarlas. Lo que puede hacer es preservar su efecto al pasar los argumentos al comando interno y reconstruir una versión equivalente entre comillas/escapados de los argumentos para imprimir.
Para pasar los argumentos al comando interno "[email protected]"
-- con las comillas dobles, [email protected] conserva los saltos de palabras originales, lo que significa que el comando interno recibe exactamente la misma lista de argumentos que recibió su secuencia de comandos.
Para imprimir, puede usar el formato %q en el comando printf de bash para reconstruir la cotización. Tenga en cuenta que esto no siempre reconstruirá la cita original, sino que construirá un equivalente cadena entre comillas/escapado. Por ejemplo, si pasó el argumento 'uptime ; uname -a'
podría imprimir uptime\ \;\ uname\ -a
o "uptime ; uname -a"
o cualquier otro equivalente (consulte la respuesta de @William Pursell para ver ejemplos similares).
Aquí hay un ejemplo del uso de estos:
printf "Running command:"
printf " %q" innercmd "[email protected]" # note the space before %q -- this inserts spaces between arguments
printf "\n"
innercmd "[email protected]"
Si el usuario invoca su comando como:
./script 'foo'
el primer argumento dado al script es la cadena foo
sin las comillas. No hay forma de que su secuencia de comandos diferencie entre ese y cualquiera de los otros métodos por los cuales podría obtener foo
como argumento (por ejemplo, ./script $(echo foo)
o ./script foo
o ./script "foo"
o ./script \f\o""''""o
).
Si desea imprimir la lista de argumentos lo más cerca posible de lo que probablemente ingresó el usuario:
#!/bin/bash
chars='[ !"#$&()*,;<>?\^`{|}]'
for arg
do
if [[ $arg == *\'* ]]
then
arg=\""$arg"\"
elif [[ $arg == *$chars* ]]
then
arg="'$arg'"
fi
allargs+=("$arg") # ${allargs[@]} is to be used only for printing
done
printf '%s\n' "${allargs[*]}"
no es perfecto Un argumento como ''\''"'
es más difícil de acomodar de lo que se justifica.