2017-10-16 10 views
1

J'ai un script bash myscript.sh. Je veux dire d'appeler un autre script, commande ou builtin de l'intérieur, par exemple, diff. Je veux dire passer des options à myscript.sh, dont certaines seraient passées à diff lors de l'appel.Passer les options reçues dans le script bash vers un script appelé, une commande ou une commande intégrée

La façon dont je mis en œuvre c'est en mettant en place une chaîne d'option optstring via getopt, puis en utilisant

eval "diff ${optstring} ${file} ${TRG_DIR}/${filebase2}" 

Jusqu'à présent, cela a fonctionné, mais je ne sais pas si cela est sujette à des problèmes lors du passage des arguments avec des caractères génériques, etc. En tout cas, ...

Y a-t-il une meilleure façon de le faire?


La façon dont je mis en place optstring est

set -o errexit -o noclobber -o nounset -o pipefail 
params="$(getopt -o qy --long brief,side-by-side,suppress-common-lines --name "$0" -- "[email protected]")" 

if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi 

echo params=$params 
echo [email protected] 

eval set -- "$params" 

optstring="" 
# These variables are likely not needed 
brief=false 
sbs=false 
scl=false 

#while false ; do 
while true ; do 
    case "$1" in 
     -q|--brief) 
      optstring=${optstring}" -q" 
      brief=true 
      echo "brief" 
      shift 
      ;; 
     -y|--side-by-side) 
      optstring=${optstring}" -y" 
      sbs=true 
      echo "side-by-side" 
      shift 
      ;; 
     --suppress-common-lines) 
      optstring=${optstring}" --suppress-common-lines" 
      scl=true 
      echo "suppress-common-lines" 
      shift 
      ;; 
     --) 
      shift 
      break 
      ;; 
     *) 
      echo "Not implemented: $1" >&2 
      exit 1 
      ;; 
    esac 
done 
echo optstring=${optstring} 

Répondre

2

Utilisez un tableau. Les tableaux peuvent gérer des arguments multi-mots avec des espaces. Initialiser un tableau blanc avec:

options=() 

Pour ajouter une option, faire:

options+=(--suppress-common-lines) 

Puis, finalement, vous pouvez vous débarrasser de l'eval lorsque vous appelez diff et juste appeler normalement. Assurez-vous de citer toutes les extensions variables dans le cas où ils ont des espaces:

diff "${options[@]}" "$file" "$TRG_DIR/$filebase2" 
+0

Je trouve que quand il n'y a pas d'options, je reçois l'erreur 'options [@]: variable' non lié. Comment puis-je m'en débarrasser? –

+0

https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u résout le problème. –