Si vous n'êtes pas complètement attaché à l'utilisation de "from" et "to" comme noms d'options, 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 analyse facilement pour vous.
f:t:
spécifie que vous attendez 2 paramètres qui contiennent des valeurs (indiquées par les deux-points). Quelque chose comme f:t:v
dit que -v
ne sera interprété que comme un indicateur.
opts
est l'endroit où le paramètre actuel est stocké. Le case
est l'endroit où vous traiterez cela.
${OPTARG}
contient la valeur suivant le paramètre. ${FROM_VAL}
obtiendra par exemple 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 notions de base. Ce n'était qu'un rapide tutoriel sur la façon dont getopts
fonctionne.
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 le -from
et -to
dans la commande, ils se retrouveront également dans ces variables, donc pour ceci :
./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt
Vous obtiendrez :
$0 # ocrscript.sh
$1 # -from
$2 # /home/kristoffer/test.png
$3 # -to
$4 # /home/kristoffer/test.txt
Il serait peut-être plus simple 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 peuvent faciliter l'analyse des arguments nommés sur la ligne de commande, mais généralement, pour les scripts shell simples, vous devez simplement utiliser la méthode la plus simple, si cela ne pose aucun problème.
Ensuite, vous pouvez faire :
/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1
Les guillemets autour du $1
et le $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 doubles.
Utilisez les variables "$1"
, "$2"
, "$3"
et ainsi de suite pour accéder aux arguments. Pour accéder à tous, vous pouvez utiliser "[email protected]"
, ou pour obtenir le nombre d'arguments $#
(peut être utile pour vérifier trop peu ou trop d'arguments).
Je devais m'assurer que mes scripts sont entièrement portables entre différentes machines, shells et même versions de cygwin. De plus, mes collègues pour qui j'ai dû écrire les scripts sont des programmeurs, donc 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 inclus un launcher.sh
script également, puisque toute l'opération comportait plusieurs étapes quasi indépendantes les unes des autres (je dis "quasi", car même si chaque script pouvait être exécuté seul, ils étaient généralement tous exécutés ensemble), et en deux jours, j'ai découvert qu'environ la moitié de mes collègues, programmeurs et tous, étaient trop bons pour utiliser le fichier de lancement, suivre "l'utilisation" ou lire l'AIDE qui s'affichait à chaque fois qu'ils faisaient quelque chose de mal et qu'ils faisaient un gâchis de tout, 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 que je suis, j'ai décidé de 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.