it-swarm.com.de

Bash-Scripting: Wenn Argumente dieser Zeichenfolge entsprechen, definieren Sie eine Variable wie diese Zeichenfolge

Ich mache ein Bash-Skript und jetzt habe ich einen Variablenaufruf source und ein Array mit dem Namen samples, wie folgt:

source='country'
samples=(US Canada Mexico...)

da ich die Anzahl der Quellen erweitern möchte (und jede Quelle ihre eigenen Beispiele hat), habe ich versucht, einige Argumente hinzuzufügen, um dies zu tun. Ich habe es versucht:

source=""
samples=("")
if [ $1="country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
   echo "try again"
fi

aber als ich mein script source countries.sh country ausführte, funktionierte es nicht. Was mache ich falsch?

195
Alejandro

Vergiss die Leerzeichen nicht:

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi
354
Alex L

Sie können entweder die Operatoren "=" oder "==" für den Zeichenfolgenvergleich in bash verwenden. Der wichtige Faktor ist der Abstand innerhalb der Klammern. Die richtige Methode besteht darin, dass Klammern einen Abstand und Operatoren einen Abstand enthalten. In einigen Fällen funktionieren verschiedene Kombinationen. Das Folgende soll jedoch ein universelles Beispiel sein.

if [ "$1" == "something" ]; then     ## GOOD

if [ "$1" = "something" ]; then      ## GOOD

if [ "$1"="something" ]; then        ## BAD (operator spacing)

if ["$1" == "something"]; then       ## BAD (bracket spacing)

Beachten Sie auch, dass doppelte Klammern etwas anders behandelt werden als einzelne Klammern ...

if [[ $a == z* ]]; then   # True if $a starts with a "z" (pattern matching).
if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching).

if [ $a == z* ]; then     # File globbing and Word splitting take place.
if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching).

Ich hoffe das hilft!

162
Vyke

Anscheinend möchten Sie Befehlszeilenargumente in Ihr Bash-Skript einbauen. Ich habe das kürzlich selbst gesucht. Ich bin auf Folgendes gestoßen, von dem ich denke, dass es Ihnen beim Parsen der Argumente helfen wird:

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

Ich habe das folgende Snippet als tl; dr hinzugefügt

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing.
while getopts “ht:r:p:v” OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     usage
     exit 1
fi

./script.sh -t test -r Server -p Passwort -v

10
ioneyed

Auf den ersten Blick führen Sie in Ihrer if-Anweisung eine Zuweisung = anstelle einer Vergleichsanweisung == durch. Grundsätzlich müssen Sie Folgendes tun:

mysource=""
samples=("")


if [ "$1" == "country" ]; then
   mysource="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi

IE:

~$ source /tmp/foo.sh country
~$ echo $samples 
US Canada Mexico...

Ist es das was du willst?

4
hmontoliu