Paramètres de script dans Bash

J’essaie de faire un script shell qui devrait être utilisé comme ceci:

ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt 

Le script convertira ensuite le fichier image en fichier texte. Voici ce que j’ai inventé jusqu’ici:

 #!/bin/bash export HOME=/home/kristoffer /usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1 

Mais je ne sais pas comment obtenir les valeurs -from et -to . Des idées sur la façon de le faire?

Les arguments que vous fournissez à un bashscript apparaîtront dans les variables $1 et $2 et $3 où le nombre fait référence à l’argument. $0 est la commande elle-même.

Les arguments sont séparés par des espaces, donc si vous fournissez les -from et -to dans la commande, ils finiront aussi dans ces variables, donc pour cela:

 ./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt 

Tu auras:

 $0 # ocrscript.sh $1 # -from $2 # /home/kristoffer/test.png $3 # -to $4 # /home/kristoffer/test.txt 

Il pourrait être plus facile d’omettre le -from et le -to , comme:

 ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt 

Ensuite, vous aurez:

 $1 # /home/kristoffer/test.png $2 # /home/kristoffer/test.txt 

L’inconvénient est que vous devrez le fournir dans le bon ordre. Il existe des bibliothèques qui facilitent l’parsing syntaxique des arguments nommés sur la ligne de commande, mais généralement, pour les scripts simples, vous devez utiliser la méthode simple, si ce n’est pas un problème.

Ensuite, vous pouvez faire:

 /usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1 

Les guillemets autour de $1 et $2 ne sont pas toujours nécessaires mais sont conseillés, car certaines chaînes ne fonctionneront pas si vous ne les mettez pas entre guillemets.

Si vous n’êtes pas complètement attaché à utiliser “from” et “to” comme noms d’option, il est assez facile de l’implémenter en utilisant getopts :

 while getopts f:t: opts; do case ${opts} in f) FROM_VAL=${OPTARG} ;; t) TO_VAL=${OPTARG} ;; esac done 

getopts est un programme qui traite les arguments de la ligne de commande et les parsing facilement pour vous.

f:t: spécifie que vous attendez 2 parameters contenant des valeurs (indiquées par deux points). Quelque chose comme f:t:v dit que -v ne sera interprété que comme un drapeau.

opts est l’endroit où le paramètre actuel est stocké. La déclaration de case est l’endroit où vous allez traiter cela.

${OPTARG} contient la valeur suivant le paramètre. ${FROM_VAL} par exemple obtiendra la valeur /home/kristoffer/test.png si vous avez exécuté votre script comme:

ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt

Comme les autres le suggèrent, si c’est la première fois que vous écrivez des scripts bash, vous devriez vraiment lire quelques bases. Ce n’était qu’un petit tutoriel sur le fonctionnement de getopts .

Utilisez les variables "$1" , "$2" , "$3" , etc. pour accéder aux arguments. Pour accéder à tous, vous pouvez utiliser "$@" , ou obtenir le nombre d’arguments $# (cela pourrait être utile pour vérifier s’il y a trop peu ou trop d’arguments).

J’avais besoin de m’assurer que mes scripts sont entièrement portables entre différentes machines, shells et même les versions de cygwin. De plus, mes collègues qui étaient ceux pour lesquels je devais écrire les scripts sont des programmeurs, alors j’ai fini par utiliser ceci:

 for ((i=1;i<=$#;i++)); do if [ ${!i} = "-s" ] then ((i++)) var1=${!i}; elif [ ${!i} = "-log" ]; then ((i++)) logFile=${!i}; elif [ ${!i} = "-x" ]; then ((i++)) var2=${!i}; elif [ ${!i} = "-p" ]; then ((i++)) var3=${!i}; elif [ ${!i} = "-b" ]; then ((i++)) var4=${!i}; elif [ ${!i} = "-l" ]; then ((i++)) var5=${!i}; elif [ ${!i} = "-a" ]; then ((i++)) var6=${!i}; fi done; 

Justification: J'ai également inclus un script launcher.sh , car l'opération comportait plusieurs étapes quasi indépendantes l'une de l'autre (je dis "quasi", car même si chaque script pouvait être exécuté seul, il était généralement tous courent ensemble), et en deux jours, j'ai découvert qu'environ la moitié de mes collègues, programmeurs et autres, étaient trop bons pour utiliser le fichier de lancement, suivre "l'utilisation" ou lire l'aide qui était affichée à chaque fois ils ont fait quelque chose de mal et ils étaient en train de tout gâcher, exécutant des scripts avec des arguments dans le mauvais ordre et se plaignant que les scripts ne fonctionnaient pas correctement. Étant le colérique, je suis décidé à réviser tous mes scripts pour m'assurer qu'ils sont à l'épreuve des collègues. Le segment de code ci-dessus était la première chose.

En bash, $1 est le premier argument passé au script, $2 secondes et ainsi de suite

 /usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1 

Donc, vous pouvez utiliser:

 ./your_script.sh some_source_file.png destination_file.txt 

Explication sur les guillemets doubles;

considérer trois scripts:

 # foo.sh bash bar.sh $1 # cat foo2.sh bash bar.sh "$1" # bar.sh echo "1-$1" "2-$2" 

Invoquez maintenant:

 $ bash foo.sh "ab" 1-a 2-b $ bash foo2.sh "ab" 1-ab 2- 

Lorsque vous invoquez foo.sh "ab" il appelle bar.sh ab (deux arguments) et avec foo2.sh "ab" il invoque bar.sh "ab" (1 argument). Gardez toujours à l’esprit comment les parameters sont transmis et développés dans bash, cela vous évitera beaucoup de maux de tête.