it-swarm.com.de

Überprüfen Sie die Anzahl der Argumente, die an ein Bash-Skript übergeben werden

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?

564
Naftaly

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.

Verweise:

858
konsolebox

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
33
jhvaras

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
27
Pat

Eine einfache Einlage, die funktioniert, kann mit folgendem durchgeführt werden:

[ "$#" -ne 1 ] && ( usage && exit 1 ) || main

Dies lässt sich wie folgt zusammenfassen:

  1. testet die bash-Variable auf die Größe der Parameter $ # entspricht nicht 1 (unsere Anzahl von Unterbefehlen)
  2. wenn true, rufen Sie die use () - Funktion auf und beenden Sie den Status 1
  3. ansonsten rufen Sie die main () - Funktion auf

Denkt zu beachten:

  • usage () kann nur ein einfaches Echo sein "$ 0: params"
  • main kann ein langes Skript sein
12
Dwight Spencer

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.

1
Nick Hall

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

0
IsaacE

Sie sollten Leerzeichen zwischen den Testbedingungen hinzufügen:

if [ $# -ne 1 ]; 
    then echo "illegal number of parameters"
fi

Ich hoffe das hilft.

0
Fabricio

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
0
panticz.de