it-swarm.com.de

Wie kann ich ein Befehlszeilenargument an ein Shell-Skript übergeben?

Ich weiß, dass Shell-Skripte nur Befehle ausführen, als ob sie bei der Eingabeaufforderung ausgeführt würden. Ich möchte in der Lage sein, Shell-Skripte so auszuführen, als wären sie Funktionen ... Das heißt, Sie geben einen Eingabewert oder eine Zeichenfolge in das Skript ein. Wie gehe ich damit um?

295
Paul

Der Shell-Befehl und alle Argumente für diesen Befehl werden als nummeriert Shell-Variablen angezeigt: $0 Hat den Zeichenfolgenwert des Befehls selbst, etwa script, ./script, /home/user/bin/script Oder was auch immer. Alle Argumente werden als "$1", "$2", "$3" Usw. angezeigt. Die Anzahl der Argumente befindet sich in der Shell-Variablen "$#".

Übliche Methoden, um damit umzugehen, sind die Shell-Befehle getopts und shift. getopts ist der Bibliotheksfunktion C getopt() sehr ähnlich. shift verschiebt den Wert von $2 nach $1, $3 nach $2 und so weiter; $# Wird dekrementiert. Am Ende betrachtet Code den Wert von "$1", Führt Dinge mit einem caseesac aus, um über eine Aktion zu entscheiden, und führt dann ein shift aus, um sich zu bewegen $1 Zum nächsten Argument. Es muss immer nur $1 Und vielleicht $# Untersucht werden.

228
Bruce Ediger

Sie können mit $n Auf übergebene Argumente zugreifen, wobei n die Argumentnummer ist - 1, 2, 3, .... Sie übergeben die Argumente wie bei jedem anderen Befehl.

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
205
Kevin

In einem Bash-Skript verwende ich persönlich gerne das folgende Skript, um Parameter festzulegen:

#!/bin/bash

helpFunction()
{
   echo ""
   echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
   echo -e "\t-a Description of what is parameterA"
   echo -e "\t-b Description of what is parameterB"
   echo -e "\t-c Description of what is parameterC"
   exit 1 # Exit script after printing help
}

while getopts "a:b:c:" opt
do
   case "$opt" in
      a ) parameterA="$OPTARG" ;;
      b ) parameterB="$OPTARG" ;;
      c ) parameterC="$OPTARG" ;;
      ? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
   esac
done

# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
   echo "Some or all of the parameters are empty";
   helpFunction
fi

# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"

Bei dieser Struktur verlassen wir uns nicht auf die Reihenfolge der Parameter, da wir für jeden einen Schlüsselbuchstaben definieren. Außerdem wird die Hilfefunktion immer dann gedruckt, wenn die Parameter falsch definiert sind. Es ist sehr nützlich, wenn wir viele Skripte mit unterschiedlichen Parametern verarbeiten müssen. Es funktioniert wie folgt:

$ bash myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C

$ bash myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C

$ bash myscript -a "String A" -c "String C" -f "Non-existent parameter"
myscript: illegal option -- f

Usage: myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC

$ bash myscript -a "String A" -c "String C"
Some or all of the parameters are empty

Usage: myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC
34
Rafael Muynarsk
$/shellscriptname.sh argument1 argument2 argument3 

Sie können die Ausgabe eines Shell-Skripts auch als Argument an ein anderes Shell-Skript übergeben.

$/shellscriptname.sh "$(secondshellscriptname.sh)"

Innerhalb des Shell-Skripts können Sie auf Argumente mit Zahlen wie $1 Für das erste Argument und $2 Für das zweite Argument usw. zugreifen.

Mehr zu Shell-Argumenten

32

Die Form

$ ./script.sh "[email protected]" 

ist am bequemsten für argv. Das Argumenttrennzeichen ist ein Leerzeichen, kann jedoch geändert werden. Ich erinnere mich nicht, wie spontan. Dann benutze

 $1, $2, shift, if [ $# -ne 3 ] 

fluss zu steuern. Normalerweise nehme ich getopts nicht an, wenn ein case ... esac wird genügen.

21
user400344
./myscript myargument

myargument wird $1 inside myscript.

14
vimdude

Im Shell-Skript; es wird der Variablenname $ 1. Das zweite Wort wird zum Variablennamen $ 2 und so weiter.

cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: [email protected]"
EOF
sh test hello world

Weitere Informationen finden Sie im Shell (sh) -Handbuch unter http://heirloom.sourceforge.net/sh/sh.1.html

8
FireInTheSky

Wenn Sie mit Python argparse) vertraut sind und es Ihnen nichts ausmacht, python zum Aufrufen von Bash-Argumenten aufzurufen, verwenden Sie Bash Argparse ( https://github.com/mattbryson/bash-arg-parse ),

Die gleiche Antwort finden Sie hier: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287

1
Linh
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null

------------------------------------------------------------------------

./scriptname.sh value1 value2
0
Yogesh

Folgendes gehört mir:

#!/bin/bash 
echo 'First arg:' $1 
echo 'Second arg:' $2 

Der Shell-Name lautet para_script.sh

Führen Sie es dann aus: ./para_script.sh hello world

0
Newt