GNU/Linux >> Tutoriels Linux >  >> Linux

Conserver les guillemets dans les arguments bash

Les guillemets sont supprimés avant que les arguments ne soient passés à votre script, il est donc trop tard pour les conserver. Ce que vous pouvez faire est de préserver leur effet lors du passage des arguments à la commande interne et de reconstruire une version équivalente entre guillemets/échappée des arguments pour l'impression.

Pour passer les arguments à la commande interne "[email protected]" -- avec les guillemets doubles, [email protected] conserve les sauts de mots d'origine, ce qui signifie que la commande interne reçoit exactement la même liste d'arguments que votre script.

Pour l'impression, vous pouvez utiliser le format %q dans la commande printf de bash pour reconstruire les guillemets. Notez que cela ne reconstruira pas toujours la citation d'origine, mais construira un équivalent chaîne entre guillemets/échappée. Par exemple, si vous avez passé l'argument 'uptime ; uname -a' il pourrait imprimer uptime\ \;\ uname\ -a ou "uptime ; uname -a" ou tout autre équivalent (voir la réponse de @William Pursell pour des exemples similaires).

Voici un exemple d'utilisation :

printf "Running command:"
printf " %q" innercmd "[email protected]" # note the space before %q -- this inserts spaces between arguments
printf "\n"
innercmd "[email protected]"

Si l'utilisateur appelle votre commande en tant que :

./script 'foo'

le premier argument donné au script est la chaîne foo sans les guillemets. Il n'y a aucun moyen pour votre script de faire la différence entre cela et l'une des autres méthodes par lesquelles il pourrait obtenir foo comme argument (par exemple ./script $(echo foo) ou ./script foo ou ./script "foo" ou ./script \f\o""''""o ).


Si vous souhaitez imprimer la liste des arguments aussi proche que possible de ce que l'utilisateur a probablement saisi :

#!/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[*]}"

Ce n'est pas parfait. Un argument comme ''\''"' est plus difficile à accommoder qu'il n'est justifié.


Linux
  1. La commande "eval" dans Bash ?

  2. Passer les arguments de la ligne de commande au script Bash ?

  3. Comment puis-je rappeler l'argument de la commande bash précédente ?

  4. arguments de ligne de commande pour l'exécution de docker

  5. Exécutez la commande bash sur le pipeline jenkins

Commande de source bash

Commande d'historique sous Linux (historique de bash)

Commande de sortie Bash et codes de sortie

Commande Bash printf

Script bash (II)

Script bash (III)