Ich möchte, dass mein Bash-Skript eine Fehlermeldung ausgibt, wenn die erforderliche Argumentanzahl nicht erfüllt ist.
Ich habe folgenden Code ausprobiert:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Aus irgendeinem unbekannten Grund habe ich den folgenden Fehler erhalten:
test: line 4: [2: command not found
Was mache ich falsch?
Genau wie bei jedem anderen einfachen Befehl erfordert [ ... ]
oder test
Leerzeichen zwischen seinen Argumenten.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Oder
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
Wenn Sie sich in der Bash-Version befinden, ziehen Sie stattdessen [[ ]]
vor, da die Word-Aufteilung und die Erweiterung des Pfadnamens nicht für die Variablen verwendet werden. Die Anführungszeichen sind möglicherweise nur dann erforderlich, wenn sie Teil eines Ausdrucks sind.
[[ $# -ne 1 ]]
Es hat auch einige andere Funktionen, wie die Gruppierung von Anführungszeichen ohne Anführungszeichen, Musterabgleich (erweiterter Musterabgleich mit extglob
) und Regex-Abgleich.
Im folgenden Beispiel wird geprüft, ob Argumente gültig sind. Es erlaubt ein oder zwei Argumente.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Bei reinen arithmetischen Ausdrücken ist die Verwendung von (( ))
für einige möglicherweise noch besser. Sie sind jedoch in [[ ]]
mit arithmetischen Operatoren wie -eq
, -ne
, -lt
, -le
, -gt
oder -ge
noch möglich, indem der Ausdruck als einzelnes String-Argument verwendet wird:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Das sollte hilfreich sein, wenn Sie es auch mit anderen Funktionen von [[ ]]
kombinieren müssen.
Wenn Sie mit Zahlen arbeiten, sollten Sie arithmetische Ausdrücke verwenden.
if (( $# != 1 )); then
echo "Illegal number of parameters"
fi
Bei []:! =, =, == ... sind Zeichenfolge Vergleichsoperatoren und -eq, -gt ... sind Arithmetik Binäre.
Ich würde ... benutzen:
if [ "$#" != "1" ]; then
Oder:
if [ $# -eq 1 ]; then
Wenn Sie nur daran interessiert sind, zu retten, wenn ein bestimmtes Argument fehlt, ist Parameter Substitution großartig:
#!/bin/bash
# usage-message.sh
: ${1?"Usage: $0 ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
Eine einfache Einlage, die funktioniert, kann mit folgendem durchgeführt werden:
[ "$#" -ne 1 ] && ( usage && exit 1 ) || main
Dies lässt sich wie folgt zusammenfassen:
Denkt zu beachten:
Check out this bash Cheatsheet, es kann viel helfen.
Um die Länge der übergebenen Argumente zu überprüfen, verwenden Sie "$#"
Um das übergebene Array von Argumenten zu verwenden, verwenden Sie "[email protected]"
Ein Beispiel für die Überprüfung der Länge und Iteration wäre:
myFunc() {
if [[ "$#" -gt 0 ]]; then
for arg in "[email protected]"; do
echo $arg
done
fi
}
myFunc "[email protected]"
Dieser Artikel hat mir geholfen, aber es fehlten ein paar Dinge für mich und meine Situation. Hoffentlich hilft das jemandem.
Für den Fall, dass Sie auf der sicheren Seite sein möchten, empfehle ich die Verwendung von Getopts.
Hier ist ein kleines Beispiel:
while getopts "x:c" opt; do
case $opt in
c)
echo "-$opt was triggered, deploy to ci account" >&2
DEPLOY_CI_ACCT="true"
;;
x)
echo "-$opt was triggered, Parameter: $OPTARG" >&2
CMD_TO_EXEC=${OPTARG}
;;
\?)
echo "Invalid option: -$OPTARG" >&2
Usage
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
Usage
exit 1
;;
esac
done
weitere Informationen finden Sie hier zum Beispiel http://wiki.bash-hackers.org/howto/getopts_tutorial
Sie sollten Leerzeichen zwischen den Testbedingungen hinzufügen:
if [ $# -ne 1 ];
then echo "illegal number of parameters"
fi
Ich hoffe das hilft.
Hier ein einfacher Einzeiler, um zu überprüfen, ob nur ein Parameter angegeben ist. Andernfalls wird das Skript beendet:
[ "$#" -ne 1 ] && echo "USAGE $0 <PARAMETER>" && exit