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 je suis arrivé jusqu'à présent:
#!/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 script bash 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 le -to
dans la commande, ils se retrouveront également 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 serait peut-ê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'analyse des arguments nommés sur la ligne de commande, mais pour les scripts Shell simples, vous devez simplement utiliser la méthode la plus 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 du $1
et du $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 "de" et "à" comme nom 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 en ligne de commande et les analyse pour vous.
f:t:
spécifie que vous attendez 2 paramètres contenant des valeurs (indiquées par les deux points). Quelque chose comme f:t:v
indique que -v
ne sera interprété que comme un indicateur.
opts
est l'endroit où le paramètre actuel est stocké. La déclaration 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 de la manière suivante:
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 petit tutoriel sur le fonctionnement de getopts
.
Utilisez les variables "$1"
, "$2"
, "$3"
et ainsi de suite pour accéder aux arguments. Pour accéder à tous, vous pouvez utiliser "$@"
ou obtenir le nombre d'arguments $#
(il peut être utile de rechercher trop peu ou trop d'arguments).
Je devais m'assurer que mes scripts sont entièrement portables entre différentes machines, coques et même versions de cygwin. De plus, mes collègues pour qui j'ai dû é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 entière comportait plusieurs étapes quasi indépendantes les unes des autres (je dis "quasi", car même si chaque script pouvait être exécuté seul, en général, 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 du programme de lancement, suivre les "utilisations" ou lire l'aide qui était affichée. chaque fois qu'ils ont fait quelque chose de mal et qu'ils ont tout gâché, en exécutant des scripts avec des arguments dans le mauvais ordre et en se plaignant que les scripts ne fonctionnaient pas correctement. En tant que colérique, je suis décidé de réviser tous mes scripts pour s’assurer qu’ils sont à l’épreuve des collègues. Le segment de code ci-dessus était la première chose.
Dans bash $1
est le premier argument transmis au script, $2
second, etc.
/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1
Pour que vous puissiez utiliser:
./your_script.sh some_source_file.png destination_file.txt
Explication sur les guillemets doubles;
considérons trois scripts:
# foo.sh
bash bar.sh $1
# cat foo2.sh
bash bar.sh "$1"
# bar.sh
echo "1-$1" "2-$2"
Maintenant invoquer:
$ bash foo.sh "a b"
1-a 2-b
$ bash foo2.sh "a b"
1-a b 2-
Lorsque vous appelez foo.sh "a b"
, il appelle alors bar.sh a b
(deux arguments) et avec foo2.sh "a b"
il appelle bar.sh "a b"
(un argument). Ayez toujours à l’esprit la manière dont les paramètres sont passés et étendus dans bash, cela vous évitera beaucoup de maux de tête.