GNU/Linux >> Tutoriales Linux >  >> Linux

Conservar comillas en argumentos bash

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.


Linux
  1. ¿Pasar argumentos de línea de comando a Bash Script?

  2. ¿Cómo puedo recordar el argumento del comando bash anterior?

  3. comando de exportación bash

  4. comando bash alias con comillas simples y dobles

  5. Argumentos de la línea de comando para ejecutar la ventana acoplable

Comando de fuente Bash

Comando de historial en Linux (Bash History)

Comando de salida de Bash y códigos de salida

Comando Bash printf

Script Bash (II)

Script Bash (III)