GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So verwenden Sie Eingaben in Ihren Shell-Skripten

Es ist ein altes Zitat, aber ich denke, dass dieses Prinzip von Perl-Erfinder Larry Wall immer noch gültig ist:

"Der faule Programmierer wird alles wiederverwenden, was er kann, um seine Arbeit zu erledigen. Diese Tugend führt zur Wiederverwendung von Code, indem Code dazu ermutigt wird, nur einmal geschrieben zu werden."

— Larry Wall, „Die drei Tugenden eines Programmierers“

Nehmen wir an, Sie haben es satt, immer dieselbe Befehlsfolge einzugeben, und erstellen endlich ein nettes Shell-Skript, um Dinge mit weniger Tastenanschlägen auszuführen. Aber manchmal möchten Sie es mit anderen Argumenten ausführen, und Sie auf jeden Fall Ich möchte Ihr großartiges Skript nicht duplizieren. Sie benötigen eine Möglichkeit, Argumente über die Befehlszeile bereitzustellen und zu verwenden. Dieser Artikel behandelt genau das.

Skripteingaben verarbeiten

Shell-Skripte haben Zugriff auf einige "magische" Variablen aus der Umgebung:

  • $0 - Der Name des Skripts
  • $1 - Das erste an das Skript gesendete Argument
  • $2 - Das zweite an das Skript gesendete Argument
  • $3 - Das dritte Argument... und so weiter
  • $# - Die Anzahl der bereitgestellten Argumente
  • $@ - Eine Liste aller bereitgestellten Argumente
#!/bin/bash

if [ $# -eq 0 ];
then
  echo "$0: Missing arguments"
  exit 1
elif [ $# -gt 2 ];
then
  echo "$0: Too many arguments: $@"
  exit 1
else
  echo "We got some argument(s)"
  echo "==========================="
  echo "Number of arguments.: $#"
  echo "List of arguments...: $@"
  echo "Arg #1..............: $1"
  echo "Arg #2..............: $2"
  echo "==========================="
fi

echo "And then we do something with $1 $2"

Hier sind ein paar Beispiele für die Ausführung mit verschiedenen Kombinationen von Argumenten:

$ ./ex01.sh 
./ex01.sh: Missing arguments

$ ./ex01.sh aa
We got some argument(s)
===========================
Number of arguments.: 1
List of arguments...: aa
Arg #1..............: aa
Arg #2..............: 
===========================
And then we do something with aa 

$ ./ex01.sh aa bb
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: aa bb
Arg #1..............: aa
Arg #2..............: bb
===========================
And then we do something with aa bb

$ ./ex01.sh aa bb cc
./ex01.sh: Too many arguments: aa bb cc

Das ist in Ordnung, wenn Sie ein oder zwei Argumente haben. Beachten Sie jedoch, dass das Standardtrennzeichen zwischen Argumenten das Leerzeichen ist. Und da Leerzeichen das Standardtrennzeichen für Argumente ist, können interessante Dinge passieren. Das passiert beispielsweise, wenn Sie Anführungszeichen mit mehr als zwei Argumenten verwenden:

$ ./ex01.sh aa "bb cc xx yy zz"
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: aa bb cc xx yy zz
Arg #1..............: aa
Arg #2..............: bb cc xx yy zz
===========================
And then we do something with aa bb cc xx yy zz

Beachten Sie, dass das Skript bb cc xx yy zz interpretiert als eins Argument, da die Werte in doppelte Anführungszeichen gesetzt werden, was auch in Ordnung ist, wenn Sie dies möchten.

[ Halten Sie Ihre Linux-Befehle immer griffbereit. Laden Sie den Spickzettel für fortgeschrittene Linux-Befehle herunter. ]

Eine weitere interessante Sache ist, wenn Ihr Skript Argumente von Variablen erhält . Wenn die Variable Leerzeichen enthält, müssen Sie entscheiden, ob Sie das wollen Wert, der als einzelnes Argument behandelt werden soll, oder alle Teile, die als unterschiedliche Argumente behandelt werden sollen:

$ export AUTHOR="John Lennon"

$ export SONG="Imagine"

$ ./ex01.sh $AUTHOR $SONG
./ex01.sh: Too many arguments: John Lennon Imagine

$ ./ex01.sh "$AUTHOR" "$SONG"
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: John Lennon Imagine
Arg #1..............: John Lennon
Arg #2..............: Imagine
===========================
And then we do something with John Lennon Imagine

Wenn Sie die Argumente als Variablen ohne Anführungszeichen senden, interpretiert das Skript sie alle als separate Wörter und "sieht" drei Argumente:John , Lennon , und Stellen Sie sich vor .

Verwendung von Anführungszeichen um die Variablen bewirkten, dass das Skript jede Variable als ein Argument erhielt, was in diesem Fall sinnvoller ist.

Viel mehr Argumente verarbeiten

Wie Sie gesehen haben, ist die magische Variable $@ enthält die Liste aller vom Skript empfangenen Argumente. Sie können eine Schleife verwenden, um alle Argumente zu verarbeiten:

#!/bin/bash

echo "We received $# argument(s)"

for i in "$@"
do
  echo "Arg...: $i"
done

Was Ihnen das gibt:

$ ./ex02.sh a b c e "stuff with spaces"
We received 5 argument(s)
Arg...: a
Arg...: b
Arg...: c
Arg...: e
Arg...: stuff with spaces

Sei schlau, indem du faul bist

Die wichtigen Dinge beim Umgang mit Argumenten in Ihren Shell-Skripten sind ein klares Verständnis von:

  • Welche Form könnte der Inhalt eines Arguments haben?
    • Wenn es als Variable bereitgestellt wird, was hat der "Absender" für Sie in diese Variable eingefügt?
    • Wenn es durch Benutzereingaben bereitgestellt wird, wie können Sie sicherstellen, dass der Benutzer Ihre Logik nicht "bricht"?
  • Welche Argumente sind für Ihre akzeptabel oder obligatorisch? Skript?
    • Was möchten Sie tun, wenn die Argumente ungültig sind? Das Skript könnte einen Fehler ausgeben oder vielleicht Standardwerte verwenden.

Ich hoffe, dies hilft Ihnen, weiterhin auf die richtige Weise faul zu sein ... indem Sie einige Ihrer Skripte verbessern oder wiederverwenden.


Linux
  1. So setzen Sie Ihre $PATH-Variable in Linux

  2. So verwenden Sie dd unter Linux, ohne Ihre Festplatte zu zerstören

  3. Wie behandelt man Schalter in einem Shell-Skript?

  4. So verwenden Sie Ihren dedizierten Server

  5. Wie verwende ich den su-Befehl über die Adb-Shell?

So installieren und verwenden Sie die ZSH-Shell unter Linux

So verwenden Sie GNOME-Shell-Erweiterungen [Vollständige Anleitung]

So installieren und verwenden Sie Nu Shell unter Linux

Wie verwende ich if-else in Shell-Skripten?

Wie liest man Befehlszeilenargumente in Shell-Skripten?

Verwendung von execl (Beispiel enthalten)