125 votes

Paramètres de script en Bash

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

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

Le script va ensuite convertir par ocr le fichier image en fichier texte. Voici ce que j'ai mis au point 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 la -from y -to valeurs. Avez-vous des idées sur la manière de procéder ?

143voto

rednaw Points 3856

Les arguments que vous fournissez à un bashscript apparaîtront dans les variables $1 y $2 y $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 l'argument -from y -to dans la commande, ils se retrouveront dans ces variables aussi, donc pour ceci :

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

Vous aurez :

$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 aurez :

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

L'inconvénient est que vous devrez les fournir dans le bon ordre. Il existe des bibliothèques qui peuvent rendre plus facile l'analyse des arguments nommés sur la ligne de commande, mais généralement pour les scripts simples, vous devriez juste utiliser la méthode facile, si ce n'est pas un problème.

Alors vous pouvez le faire :

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

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

78voto

Manny D Points 4682

Si vous n'êtes pas complètement attaché à l'utilisation de "from" et "to" comme noms d'options, il est assez facile de mettre en œuvre cette option en utilisant les éléments suivants 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 commodément 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 sera uniquement interprété comme un drapeau.

opts est l'endroit où le paramètre actuel est stocké. Le site case est l'endroit où vous allez traiter cette question.

${OPTARG} contient la valeur qui suit le paramètre. ${FROM_VAL} par exemple, obtiendra la valeur /home/kristoffer/test.png si vous exécutez 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 rapide tutoriel sur comment getopts travaux.

41voto

StianE Points 2805

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

28voto

user1628658 Points 89

J'avais besoin de m'assurer que mes scripts sont entièrement portables entre diverses machines, shells et même versions de cygwin. De plus, mes collègues pour qui je devais é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 aussi, puisque toute l'opération avait plusieurs étapes qui étaient quasi indépendantes les unes des autres (je dis "quasi", parce que 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, étant des programmeurs et tout ça, é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 ils faisaient un gâchis de toute l'affaire, en exécutant script avec des arguments dans le mauvais ordre et en se plaignant que les script ne fonctionnaient pas correctement. Étant le colérique que je suis, j'ai décidé de réviser tous mes script pour m'assurer qu'ils sont à l'épreuve des collègues. Le segment de code ci-dessus a été la première chose à faire.

6voto

Jakub M. Points 6126

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

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"

Maintenant, invoquez :

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

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

Lorsque vous invoquez foo.sh "a b" puis il invoque bar.sh a b (deux arguments), et avec foo2.sh "a b" il invoque bar.sh "a b" (1 argument). Gardez toujours à l'esprit la façon dont les paramètres sont passés et étendus en bash, cela vous évitera bien des maux de tête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X