it-swarm.com.de

Überprüfen Sie, ob ein Eingabeargument in einem Bash Shell-Skript vorhanden ist

Ich muss das Vorhandensein 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 festzustellen, ob es existiert?

1151
user775187

Es ist:

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

Die Variable $# gibt an, wie viele Eingabeargumente das Skript übergeben hat.

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

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

Der Schalter -z testet, ob die Erweiterung von "$ 1" eine Nullzeichenfolge ist oder nicht. Wenn es sich um eine Nullzeichenfolge handelt, wird der Text ausgeführt.

2003
phoxis

Es ist besser, diesen Weg zu demonstrieren

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

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

296
Val

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 Skript unten:

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

Wenn der Benutzer scale nicht als zweiten Parameter übergeben hat, starte ich Android Emulator standardmäßig mit -scale 1. ${varname:-Word} ist ein Expansionsoperator. Es gibt auch andere Expansionsbetreiber:

  • ${varname:=Word}, der den undefinierten varname setzt , anstatt den Word -Wert zurückzugeben;
  • ${varname:?message}, das entweder varname zurückgibt, wenn es definiert ist und nicht null ist, oder das message ausgibt und das Skript abbricht (wie im ersten Beispiel);
  • ${varname:+Word}, das Word nur zurückgibt, wenn varname definiert ist und nicht null ist; Gibt sonst null zurück.
91
Aleks N.

Versuchen:

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

Eine andere 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 Arithmetic ausgewertet wird.

Um ohne Argumente auszusteigen, kann man sagen:

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

Eine andere (analoge) Möglichkeit, das Obige zu sagen, wäre:

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.
35
devnull

Ich benutze 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
21
f2cx

Nur weil es einen weiteren Basispunkt gibt, möchte ich hinzufügen, dass Sie einfach testen können, ob Ihre Zeichenfolge null ist:

if [ "$1" ]; then
  echo yes
else
  echo no
fi

Ebenso, wenn Sie Arg Count erwarten, testen Sie einfach Ihren letzten:

if [ "$3" ]; then
  echo has args correct or not
else
  echo fixme
fi

und so weiter mit jedem arg oder var

10
seorphates

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 Ihrer Zielargumentnummer ist.

Das folgende Skript zeigt, wie dies 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
Brad Parks

Zur Erinnerung: Die numerischen Testoperatoren in Bash arbeiten nur mit Ganzzahlen (-eq, -lt, -ge usw.).

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

var=$(( var + 0 ))

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

3
Cwissy