2016-01-29 4 views
1

J'ai un script pour lancer des vérifications sur la machine Ubuntu.Bash getopt - décalage de plusieurs paramètres

J'appelle mon script comme ceci: ./script -f /tmp/file.txt --modules 001 002 003

Tous les fichiers 001, 002, etc ... sont des scripts bash.

La fonction principale qui suit est mon problème:

main() { 
OPTS=`getopt -o hf:m: --long help,file:,modules: -n 'script.sh' -- "[email protected]"` 

eval set -- "$OPTS" 
    [ $# -eq 0 ] && echo "Unknown options or parameters" && USAGE 

while [ $# -gt 0 ]; do 
    case "$1" in 
      -f|--file) 
       FILE="$2" 
       shift 
       ;; 
      -h|--help) 
       USAGE 
       exit 1 
       ;; 
      -m|--modules) 
       MODULES="$2" 
       shift 
       ;; 
    esac 
    shift 
done 

[ -z "$MODULES" ] && echo "No module specified" && USAGE 
} 

Je voudrais que variable MODULES $ contient par exemple 001 002 004.
J'ai essayé différentes choses avec décalage, mais c'est un peu compliqué ..

Idéalement, si je peux utiliser "$ @" comme le reste des paramètres de script, cela pourrait être génial.

EDIT: Avec ./script.sh -f /tmp/file.txt --modules "001 002 003" enfin la variable $ MODULES contient "001 002 003", par exemple.

Mais j'ai une boucle for qui semble ne pas itérer sur tous les arguments, seulement sur le premier ... chaque $module contient "001 002 003".

for module in "$MODULES"; do 
    echo "Importing Module $module" 
    . modules/$module >> "$FILE" 
done 
+0

vous devez comprendre la différence entre what't citant une variable et en le laissant sans guillemets avec 'mod dans « $ MODULES »', vous ne va jamais avoir une seule itération de la boucle.. Avec 'pour mod dans "$ MODULES" ', vous laissez le shell exécuter [division des mots] (https://www.gnu.org/software/bash/manual/bashref.html#Word-Splitting) (et [extension de nom de fichier] (https : //www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion)!) sur la valeur de la variable, donc vous aurez plusieurs itérations à travers la boucle. [Soyez prudent cependant] (http://unix.stackexchange.com/q/171346/4667) –

+0

Je pense que je dois utiliser une liste (et non une variable), mais je ne vois pas comment créer une liste dans mon Cas' boucle. – Isador

+0

Vous feriez: 'set -f; modules = (2 $); set + f' - - les commandes set désactivent/sur l'extension du nom de fichier –

Répondre

0

Getopt ne peut pas obtenir un nombre arbitraire de valeurs, mais vous pouvez passer la liste des modules en tant que paramètre usign "et analyseur plus tard:

./script -f /tmp/file.txt --modules "001 002 003" 

vous pouvez dans le script obtenir chaque valeur individuelle :

for module in $MODULES ; do 
    echo $module 
done 
+0

Ça ne marche pas .. Quand je passe tes commandes, la variable '$ MODULES' ne contient que le premier argument .. C'est à cause de' MODULES = $ 2' je pense – Isador

+0

Vous doit mettre MODULES = "$ 2" (en utilisant "pour inclure toutes les valeurs) –

+1

J'ai vérifié votre code, je pense que le problème est que vous devez invoquer main en utilisant". 'main" $ @ "' –