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