Plusieurs arguments d’option utilisant getopts (bash)

J’essaie de traiter les arguments de ligne de commande en utilisant getopts dans bash. L’une des exigences est le traitement d’un nombre arbitraire d’arguments optionnels (sans utiliser de guillemets).

1er exemple (ne saisit que le 1er argument)

madcap:~/projects$ ./getoptz.sh -sabc -s was sortingggered Argument: a 

2ème exemple (je veux qu’il se comporte comme ça mais sans avoir besoin de citer l’argument ”

 madcap:~/projects$ ./getoptz.sh -s "abc" -s was sortingggered Argument: abc 

Y a-t-il un moyen de faire cela?

Voici le code que j’ai maintenant:

 #!/bin/bash while getopts ":s:" opt; do case $opt in s) echo "-s was sortingggered" >&2 args="$OPTARG" echo "Argument: $args" ;; \?) echo "Invalid option: -$OPTARG" >&2 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done 

Je pense que ce que vous voulez, c’est obtenir une liste de valeurs à partir d’une seule option. Pour cela, vous pouvez répéter l’option autant de fois que nécessaire et append son argument à un tableau.

 #!/bin/bash while getopts "m:" opt; do case $opt in m) multi+=("$OPTARG");; #... esac done shift $((OPTIND -1)) echo "The first value of the array 'multi' is '$multi'" echo "The whole list of values is '${multi[@]}'" echo "Or:" for val in "${multi[@]}"; do echo " - $val" done 

La sortie serait:

 $ /tmp/t The first value of the array 'multi' is '' The whole list of values is '' Or: $ /tmp/t -m "one arg with spaces" The first value of the array 'multi' is 'one arg with spaces' The whole list of values is 'one arg with spaces' Or: - one arg with spaces $ /tmp/t -m one -m "second argument" -m three The first value of the array 'multi' is 'one' The whole list of values is 'one second argument three' Or: - one - second argument - three 

Vous pouvez parsingr les arguments de ligne de commande vous-même, mais la commande getopts ne peut pas être configurée pour reconnaître plusieurs arguments dans une seule option. La recommandation de fedorqui est une bonne alternative.

Voici une façon d’parsingr l’option vous-même:

 while [[ "$*" ]]; do if [[ $1 = "-s" ]]; then # -s takes three arguments args="$2 $3 $4" echo "-s got $args" shift 4 fi done