web-dev-qa-db-fra.com

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 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?

90
Kristoffer

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.

107
gitaarik

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.

63
Manny D

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).

30
StianE

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.

21
user1628658

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.

6
Jakub M.