GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Skriptparameter in Bash

Wenn Sie nicht unbedingt "von" und "nach" als Optionsnamen verwenden möchten, 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 Kommandozeilenargumente verarbeitet und bequem für Sie parst.

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

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

${OPTARG} enthält den Wert hinter 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

Wie die anderen vorschlagen, sollten Sie sich, wenn Sie zum ersten Mal Bash-Skripte schreiben, wirklich über einige Grundlagen informieren. Dies war nur ein kurzes Tutorial, wie getopts funktioniert.


Die Argumente, die Sie einem Bashskript zur Verfügung stellen, erscheinen in den Variablen $1 und $2 und $3 wobei sich die Zahl auf das Argument bezieht. $0 ist der Befehl selbst.

Die Argumente werden durch Leerzeichen getrennt, wenn Sie also -from angeben würden und -to im Befehl landen sie auch in diesen Variablen, also dafür:

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

Sie erhalten:

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

Es könnte einfacher sein, -from wegzulassen und die -to , 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, die es einfacher machen können, benannte Argumente auf der Befehlszeile zu parsen, aber normalerweise sollten Sie für einfache Shell-Skripte einfach den einfachen Weg verwenden, wenn es kein Problem ist.

Dann können Sie Folgendes tun:

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

Die doppelten Anführungszeichen um die $1 und die $2 sind nicht immer notwendig, werden aber empfohlen, da einige Zeichenfolgen nicht funktionieren, wenn Sie sie nicht in doppelte Anführungszeichen setzen.


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


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, also habe ich am Ende Folgendes verwendet:

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 einen launcher.sh eingefügt Skript, da die ganze Operation mehrere Schritte hatte, die quasi unabhängig voneinander waren (ich sage "quasi", denn obwohl jedes Skript einzeln ausgeführt werden konnte, wurden sie normalerweise alle zusammen ausgeführt), und in zwei Tagen fand ich heraus, dass etwa die Hälfte meiner Kollegen, Programmierer und alle, zu gut waren, um die Launcher-Datei zu verwenden, der "Verwendung" zu folgen oder die HILFE zu lesen, die jedes Mal angezeigt wurde, wenn sie etwas falsch machten und machten ein Durcheinander der ganzen Sache, Skripte mit Argumenten in der falschen Reihenfolge auszuführen und sich darüber zu beschweren, dass die Skripte nicht richtig funktionierten. Da ich so cholerisch bin, habe ich beschlossen, alle meine Drehbücher zu überarbeiten, um sicherzustellen, dass sie kollegensicher sind. Das obige Codesegment war das Erste.


Linux
  1. Bash =~ Regex und Https://regex101.com/?

  2. Debian – /var, /home auf separate Partition verschieben?

  3. Wie ändere ich Mount-Punkte?

  4. ./configure :/bin/sh^M :schlechter Interpreter

  5. Warum andere Dinge als /home auf eine separate Partition legen?

35 Bash-Skriptbeispiele

Wie kann ich mein Bash-Skript auf älteren Bash-Versionen testen?

Führen Sie den Bash-Befehl auf der Jenkins-Pipeline aus

Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

So ändern Sie das Standard-/tmp in /home/user/tmp

Sollten Websites gemäß der empfohlenen Verwendung in /var/ oder /usr/ leben?