2013-04-30 3 views
0

J'écris un script Bash qui accepte les arguments de la ligne de commande, mais pas seulement un à la fois, mais tous à la fois, en utilisant des instructions case.script bash utilisant plusieurs arguments

Voici mon code jusqu'à présent

while [ $# -gt 0 ] 
do 
    case "$1" in 
     -n|--name) 
      name="$2" 
     ;; 
     -s|--size) 
      size="$2" 
     ;; 
     -l|--location) 
      location="$2" 
     ;; 
    esac 
done 

Ce code n'accepte qu'un seul à la fois, j'ai besoin pour être en mesure de préciser autant qu'ils veulent.

+3

Regardez le manuel pour 'shift'. Regardez également 'getopts', ce qui est la bonne façon de le faire –

Répondre

4

Lorsque vous utilisez getopt vous pouvez résoudre votre tâche comme suit:

OPTS=`getopt -o n:s:l: --long name:,size:,location: -- "[email protected]"` 
eval set -- "$OPTS" 

Ce divise les paramètres de position d'origine dans les options (qui prennent des arguments, indiqués par des virgules) et arguments restants, tous deux pourraient être cités. Ensuite, le résultat de getopt est évalué et set -- $OPTS définit les arguments positionnels $1, $2, $3, ... à ce que getopt obtenu. Ensuite, nous pouvons simplement faire une boucle sur les arguments positionnels (et arrêter dès que nous rencontrons -- qui sépare les options des arguments restants au script).

while true 
do 
    case "$1" in 
    -n|--name) 
     name="$2" 
     shift 2 
     ;; 
    -s|--size) 
     size="$2" 
     shift 2 
     ;; 
    -l|--location) 
     location="$2" 
     shift 2 
     ;; 
    --) 
     shift 
     break 
     ;; 
    *) 
     echo "Internal error!" 
     exit 1 
    esac 
done 

echo -e "name: $name\nsize: $size\nlocation: $location" 
Questions connexes