it-swarm.com.de

Skriptparameter in Bash

Ich versuche, ein Shell-Skript zu erstellen, das wie folgt verwendet werden sollte:

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

Das Skript konvertiert dann die Bilddatei in eine Textdatei. Folgendes habe ich mir bisher ausgedacht:

#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1

Aber ich weiß nicht, wie ich die Werte -from Und -to Erhalten soll. Irgendwelche Ideen, wie es geht?

90
Kristoffer

Die Argumente, die Sie für ein Bashskript angeben, erscheinen in den Variablen $1 Und $2 Und $3, Wobei sich die Zahl auf das Argument bezieht. $0 Ist der Befehl selbst.

Die Argumente sind durch Leerzeichen getrennt. Wenn Sie also -from Und -to Im Befehl angeben, werden sie auch in diesen Variablen abgelegt.

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

Du wirst kriegen:

$0    # ocrscript.sh
$1    # -from
$2    # /home/kristoffer/test.png
$3    # -to
$4    # /home/kristoffer/test.txt

Es könnte einfacher sein, den -from Und den -to Wegzulassen, wie:

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

Dann haben Sie:

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

Der Nachteil ist, dass Sie es in der richtigen Reihenfolge liefern müssen. Es gibt Bibliotheken, mit denen es einfacher ist, benannte Argumente in der Befehlszeile zu analysieren. Bei einfachen Shell-Skripten sollten Sie jedoch den einfachen Weg wählen, wenn dies kein Problem darstellt.

Dann können Sie tun:

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

Die doppelten Anführungszeichen um $1 Und $2 Sind nicht immer erforderlich, werden jedoch empfohlen, da einige Zeichenfolgen nicht funktionieren, wenn Sie sie nicht in doppelte Anführungszeichen setzen.

107
gitaarik

Wenn Sie nicht vollständig an die Verwendung von "von" und "bis" als Optionsnamen gebunden sind, ist es ziemlich einfach, dies mit getopts zu implementieren:

while getopts f:t: opts; do
   case ${opts} in
      f) FROM_VAL=${OPTARG} ;;
      t) TO_VAL=${OPTARG} ;;
   esac
done

getopts ist ein Programm, das Befehlszeilenargumente verarbeitet und sie bequem für Sie analysiert.

f:t: gibt an, dass Sie 2 Parameter erwarten, die Werte enthalten (angegeben durch den Doppelpunkt). So etwas wie f:t:v sagt, dass -v wird nur als Flag interpretiert.

In opts wird der aktuelle Parameter gespeichert. In der Anweisung case werden Sie dies verarbeiten.

${OPTARG} enthält den Wert nach dem Parameter. ${FROM_VAL} erhält zum Beispiel den Wert /home/kristoffer/test.png Wenn Sie Ihr Skript wie folgt ausgeführt haben:

ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt

Wenn Sie zum ersten Mal Bash-Skripte schreiben, sollten Sie sich, wie die anderen empfehlen, über einige Grundlagen informieren. Dies war nur eine kurze Einführung in die Funktionsweise von getopts.

63
Manny D

Verwenden Sie die Variablen "$1", "$2", "$3" und so weiter, um auf Argumente zuzugreifen. Um auf alle zuzugreifen, können Sie "[email protected]", oder um die Anzahl der Argumente abzurufen $# (kann nützlich sein, um nach zu wenigen oder zu vielen Argumenten zu suchen).

30
StianE

Ich musste sicherstellen, dass meine Skripte vollständig zwischen verschiedenen Maschinen, Shells und sogar Cygwin-Versionen portierbar sind. Außerdem sind meine Kollegen, für die ich die Skripte schreiben musste, Programmierer.

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;

Begründung: Ich habe ein launcher.sh Skript auch, da die gesamte Operation mehrere Schritte umfasste, die quasi unabhängig voneinander waren (ich sage "quasi", da jedes Skript für sich allein ausgeführt werden konnte, sie normalerweise alle zusammen ausgeführt wurden), und Innerhalb von zwei Tagen stellte ich fest, dass ungefähr die Hälfte meiner Kollegen, die Programmierer waren, zu gut waren, um die Startdatei zu verwenden, der "Verwendung" zu folgen oder die HILFE zu lesen, die jedes Mal angezeigt wurde, wenn sie etwas falsch machten und sie Wir haben das Ganze durcheinander gebracht, Skripte mit Argumenten in der falschen Reihenfolge ausgeführt und uns beschwert, dass die Skripte nicht richtig funktionieren. Da ich der Choleriker bin, habe ich beschlossen, alle meine Skripte zu überarbeiten, um sicherzustellen, dass sie kollegensicher sind. Das obige Codesegment war das Erste.

21
user1628658

In der Bash $1 Wird das erste Argument an das Skript übergeben, $2 Das zweite und so weiter

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

So können Sie verwenden:

./your_script.sh some_source_file.png destination_file.txt

Erklärung zu doppelten Anführungszeichen;

betrachten Sie drei Skripte:

# foo.sh
bash bar.sh $1

# cat foo2.sh
bash bar.sh "$1"

# bar.sh
echo "1-$1" "2-$2"

Rufen Sie jetzt auf:

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

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

Wenn Sie foo.sh "a b" Aufrufen, werden bar.sh a b (Zwei Argumente) und mit foo2.sh "a b"bar.sh "a b" (1 Argument) aufgerufen. Denken Sie immer daran, wie Parameter in bash übergeben und erweitert werden. Dies erspart Ihnen viel Kopfschmerzen.

6
Jakub M.