2009-11-05 4 views
3

que je dois être en mesure de lire la liste des variables qui suivent certains paramètres (similaire à dire mysqldump --databases db1 db2 db3)liste Pass des variables à script bash

Fondamentalement script doit être appelé comme ceci:

./charge.sh --notify --target aig wfc msft --amount 1bln 

Dans le script lui-même, j'ai besoin d'assigner "aig wfc msft" à une seule variable ou de créer un tableau parmi eux.

Quelle serait une bonne façon de procéder?

Répondre

10

Je trouve souvent la déclaration changement être vraiment utile dans des situations comme celle-ci. Dans une boucle while, vous pouvez tester les options attendues dans une instruction case, en désactivant l'argument 0 pendant chaque itération avec shift, jusqu'à ce que vous atteigniez la fin ou le premier paramètre positionnel.

Lorsque vous arrivez à l'argument --target dans la boucle, vous pouvez utiliser shift, pour la pop de la liste d'arguments, puis dans une boucle, ajoutez chaque argument à une liste (dans ce cas target_list de $) et shift, jusqu'à ce que vous arriviez à la fin de la liste des arguments, ou l'option suivante (quand '$ 1' commence par '-').

NOTIFY=0 
AMOUNT='' 
TARGET_LIST='' 

while :; do 
    case "$1" in 
     -h|--help) 
      echo "$HELP" 
      exit 0 
      ;; 
     --notify) 
      NOTIFY=1 
      shift 
      ;; 
     --amount) 
      shift; AMOUNT="$1"; shift 
      ;; 
     --target) 
      shift 
      while ! echo "$1" | egrep '^-' > /dev/null 2>&1 && [ ! -z "$1" ]; do 
       TARGET_LIST="$TARGET_LIST $1" 
       shift 
      done 
      ;; 
     -*) 
      # Unexpected option 
      echo $USAGE 
      exit 2 
      ;; 
     *) 
      break 
      ;; 
    esac 
done 
2

Si vous pouvez appeler le script comme celui-ci (notez les guillemets):

./charge.sh --notify --target "aig wfc msft" --amount 1bln

Vous pouvez affecter "aig WCF msft" à une seule variable.

Si vous ne pouvez pas modifier la façon dont le script est appelé et si vous pouvez garantir que les arguments de l'option --target sont toujours suivis d'une autre option ou d'un autre délimiteur, vous pouvez les stocker dans une variable.

var=$(echo $* | sed -e 's/.*--target\(.*\)--.*/\1/')
Questions connexes