Frage Überprüfen Sie das Vorhandensein des Eingabearguments in einem Bash-Shell-Skript


Ich muss die Existenz eines Eingabearguments überprüfen. Ich habe das folgende Skript

if [ "$1" -gt "-1" ]
  then echo hi
fi

Ich bekomme

[: : integer expression expected

Wie überprüfe ich zuerst das Eingabeargument1, um zu sehen, ob es existiert?


896
2018-06-26 05:49


Ursprung


Antworten:


Es ist:

if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
fi

Das $# Die Variable teilt Ihnen die Anzahl der Eingabeargumente mit, an die das Skript übergeben wurde.

Oder Sie können überprüfen, ob ein Argument eine leere Zeichenfolge ist oder nicht:

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

Das -z switch testet, ob die Erweiterung von "$ 1" eine leere Zeichenkette ist oder nicht. Wenn es eine leere Zeichenfolge ist, wird der Body ausgeführt.


1600
2018-06-26 05:55



Es ist besser, dies zu demonstrieren

if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

Sie müssen normalerweise beenden, wenn Sie zu wenige Argumente haben.


215
2017-11-13 19:25



Wenn Sie nur herausfinden möchten, ob ein bestimmtes Argument fehlt, Parametersubstitution ist toll:

#!/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

In einigen Fällen müssen Sie überprüfen, ob der Benutzer ein Argument an das Skript übergeben hat, und wenn nicht, auf einen Standardwert zurückgreifen. Wie im folgenden Skript:

scale=${2:-1}
emulator @$1 -scale $scale

Hier, wenn der Benutzer nicht bestanden hat scale Als zweiter Parameter starte ich Android Emulator mit -scale 1 standardmäßig. ${varname:-word} ist ein Erweiterungsoperator. Es gibt auch andere Expansionsoperatoren:

  • ${varname:=word} welche Sätze das undefinierte varname anstatt die zurück zu geben word Wert;
  • ${varname:?message} was entweder zurückkehrt varname wenn es definiert ist und nicht null ist oder die Datei druckt message und bricht das Skript ab (wie im ersten Beispiel);
  • ${varname:+word} was zurückkommt word nur wenn varname ist definiert und ist nicht null; gibt ansonsten null zurück.

66
2017-07-31 18:55



Versuchen:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi

26
2017-10-21 04:20



Eine weitere Möglichkeit festzustellen, ob Argumente an das Skript übergeben wurden:

((!$#)) && echo No arguments supplied!

Beachten Sie, dass (( expr )) bewirkt, dass der Ausdruck gemäß den Regeln von Shell-Arithmetik.

Um ohne Argumente auszusteigen, kann man sagen:

((!$#)) && echo No arguments supplied! && exit 1

Ein weiterer (analog) So könnte man sagen:

let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!

help let sagt:

let: let arg [arg ...]

  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.

26
2017-07-20 10:26



Ich verwende dieses Snippet oft für einfache Skripte:

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi

10
2017-12-29 17:55



Als kleine Erinnerung arbeiten die numerischen Testoperatoren in Bash nur mit Ganzzahlen (-eq, -lt, -ge, etc.)

Ich möchte sicherstellen, dass meine $ vars ints sind

var=$(( var + 0 ))

bevor ich sie teste, nur um mich gegen den Fehler "[: integer arg required" zu verteidigen.


3
2017-10-24 22:39



Wenn Sie überprüfen möchten, ob das Argument vorhanden ist, können Sie überprüfen, ob die Anzahl der Argumente größer oder gleich der Zielargumentnummer ist.

Das folgende Skript demonstriert, wie das funktioniert

test.sh

#!/usr/bin/env bash

if [ $# -ge 3 ]
then
  echo script has at least 3 arguments
fi

erzeugt die folgende Ausgabe

$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments

3
2017-09-13 16:45