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 alors le fichier image en fichier texte. Voici ce que j'ai 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. Toutes les idées sur la façon de le faire?

78
demandé sur William Perron 2013-08-01 23:57:26

5 réponses

Les arguments que vous fournissez à un bashscript apparaît 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 souhaitez fournir le -from et -to dans la commande, ils se retrouveront dans ces variables, donc, pour cela:

./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 pourrait être plus facile d'omettre le -from et le -to, comme:

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

Alors vous avoir:

$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 devriez simplement utiliser le moyen facile, si ce n'est pas un problème.

, Alors vous pouvez faire:

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

Les guillemets doubles 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 doubles.

93
répondu gitaarik 2016-12-20 10:44:08

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 ligne de commande et les analyse facilement 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 dit que {[4] } ne sera interprété que comme un drapeau.

opts est où le courant paramètre est mémorisé. L'instruction 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. C'était juste un tutoriel rapide sur le fonctionnement de getopts.

55
répondu Manny D 2013-08-01 20:17:37

Utiliser les variables "$1", "$2", "$3" et ainsi de suite pour accéder à des arguments. Pour accéder à tous d'entre eux vous pouvez utiliser "$@", ou pour obtenir le nombre d'arguments $# (peut-être utile de vérifier pour trop ou trop peu d'arguments).

26
répondu StianE 2016-09-06 08:14:30

Je devais m'assurer que mes scripts sont entièrement portables entre les différentes machines, les shells et même les versions 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, puisque toute l'opération avait 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, en tant que programmeurs et tous, étaient trop bons pour utiliser le fichier de lancement, suivre l ' "utilisation", ou lire l'aide qui était affichée chaque fois qu'ils faisaient quelque chose de mal et ils faisaient un gâchis de tout cela, 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.

15
répondu user1628658 2015-01-21 19:53:19

Dans bash $1 est le premier argument passé au script, $2 deuxième et ainsi de suite

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

Vous pouvez donc utiliser:

./your_script.sh some_source_file.png destination_file.txt

Explication sur les guillemets doubles;

Considérez 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-

Lors de l'appel de foo.sh "a b" ensuite, elle appelle bar.sh a b (deux arguments), et avec foo2.sh "a b", il invoque bar.sh "a b" (1er argument). Ayez toujours à l'esprit comment les paramètres sont passés et étendus dans bash, cela vous évitera beaucoup de maux de tête.

6
répondu Jakub M. 2013-08-01 20:18:09