40 Stimmen

Wie man mit fehlenden Args in einem Shell-Skript umgeht

Was ist der "richtige" Weg, um fehlende Argumente in einem Shell-Skript zu behandeln? Gibt es einen vorgefertigten Weg, dies zu überprüfen und dann eine Ausnahme zu machen? Ich bin ein absoluter Anfänger.

2 Stimmen

Es wäre hilfreich, wenn wir wüssten, welche Shell?

0 Stimmen

Wenn Sie mit etwas beginnen, das besser ist als eine undefinierte Shell, die Sie nicht angeben. Lernen Sie Python, es gibt nichts, was Sie mit irgendeiner Shell tun können, was Sie nicht mit Python tun können, es ist portabel und viel einfacher, anspruchsvolle Dinge zu tun, es hat auch eine sehr gute Unterstützung für das Parsen von Kommandozeilenoptionen eingebaut (Batterien inklusive)

74voto

Typische Shell-Skripte beginnen mit der Analyse der in der Befehlszeile übergebenen Optionen und Argumente. Die Anzahl der Argumente wird in der # Parameter, d.h. Sie erhalten ihn mit $# . Wenn Ihr Skript zum Beispiel genau drei Argumente benötigt, können Sie so vorgehen:

if [ $# -lt 3 ]; then
  echo 1>&2 "$0: not enough arguments"
  exit 2
elif [ $# -gt 3 ]; then
  echo 1>&2 "$0: too many arguments"
  exit 2
fi
# The three arguments are available as "$1", "$2", "$3"

Der eingebaute Befehl exit bricht die Ausführung des Skripts ab. Das Integer-Argument ist der Rückgabewert des Skripts: 0 für Erfolg und eine kleine positive Ganzzahl für Fehler (eine gängige Konvention ist, dass 1 "nicht gefunden" bedeutet (denken Sie an grep) und 2 "unerwarteter Fehler" (nicht erkannte Option, ungültiger Name der Eingabedatei, ...)).

Wenn Ihr Skript Optionen verwendet (wie -x ), verwenden getopts .

0 Stimmen

Gibt es einen Grund, warum Sie nicht exit während der zweiten bedingten Anweisung? Oder ist das ein Tippfehler?

0 Stimmen

@JW. Ohne Grund. Danke, behoben.

21voto

Markus N. Punkte 312

Beispiel-Skript (myscript.sh):

#!/bin/bash

file1=${1?param missing - from file.}
file2=${2?param missing - to file.}  
[...]

$ ./myscript.sh file1 
./myscript.sh: line 4: 2: param missing - to file.

0 Stimmen

Wenn ich mich nicht irre, ist dies bash-spezifisch.

0 Stimmen

Dies ist beschrieben unter gnu.org/software/bash/manual/

15voto

codeape Punkte 93809

El nounset bewirkt, dass die Bash nicht gesetzte Variablen und Parameter als Fehler behandelt.

Beispielskript ( myscript.sh ):

#!/bin/bash
set -o nounset

echo First argument: $1
echo OK

$ ./myscript.sh; echo $?
./myscript.sh: line 4: $1: unbound variable
1
$ ./myscript.sh foo; echo $?
First argument: foo
OK
0

1 Stimmen

Das ist genau das, wonach ich gesucht habe, und es ist viel einfacher als die akzeptierte Antwort

1 Stimmen

Einfach, dies sollte eine akzeptierte Antwort sein

6voto

ennuikiller Punkte 44945

Getopts ist hier nützlich: getopts

1 Stimmen

Wie kommen Sie zu der Annahme, dass er Bash verwendet? Der richtige Link lautet pubs.opengroup.org/onlinepubs/009695399/utilities/getopts.html

-2voto

ThorSummoner Punkte 13974

In meinem Fall habe ich GIT_SSH_COMMAND die nicht mochten -o KEY Value will sie

ssh -o KEY=value

ref https://github.com/fish-shell/fish-shell/issues/1299

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X