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

225

Ich mache ein Bash-Skript und jetzt habe ich einen Variablenaufruf sourceund ein Array namens samples:

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 Skript source countries.sh countryausführte, funktionierte es nicht. Was mache ich falsch?

Alejandro
quelle
2
wie geht das nicht Wenn Sie es ausführen, erhalten Sie eine Fehlermeldung oder es wird "erneut versuchen" oder etwas anderes angezeigt?
böse otto
2
Ja, Sie denken vielleicht, die Frage ist sehr einfach. aber du hast eine Weile darüber nachgedacht. Bitte bearbeiten Sie Ihre Frage so, dass sie die erforderlichen Ausgaben und alle Fehlermeldungen enthält, die Sie erhalten. +1 für das Ausprobieren und die gute Formatierung der Frage. Viel Glück.
Shellter
Warum entspricht dieser Code der vorgeschlagenen und akzeptierten Lösung? Das ist verwirrend ... Ich vermute, die erste Frage hatte nicht die Leerzeichen direkt nach der öffnenden Klammer und vor der schließenden Klammer des if-Satzes?
Stef
6
@Stef, wenn Sie genau hinsehen, $1="country"vs.$1 = "country"
Will

Antworten:

411

Räume nicht vergessen:

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi
Alex L.
quelle
120
Ich kann nicht glauben, dass ich drei Stunden damit verbringe und nur ein Platzproblem war !!!! ... DANKE @Alex
Alejandro
1
Warum verwenden Sie samples="US Canada Mexico..."nach der Einführung der Array-Erstellung zuvor samples=(US Canada Mexico...)?
Benutzer unbekannt
10
Ich hatte Probleme damit, als die Variable links eine leere Zeichenfolge war. Fix war if [ "$1" = "country" ]; then.
Andrew
8
Okay das ist es. Bash erhält offiziell meine Stimme als die veralteteste und noch immer verwendete Befehlssprache. Syntax ist einfach so nicht intuitiv, dass es weh tut. Wirklich kein Platz dafür in 2016+. @ Systemd-Autoren: Können Sie bitte "Erstellen einer Linux-Shell, die nicht nervt" zu Ihrem nächsten Projekt machen? Ich werde Geld auf dich werfen.
Masi
3
@masi manchmal denke ich, dass die ursprüngliche Absicht von Unix "Arbeitsplatzsicherheit durch Dunkelheit" war. Wenn die Werkzeuge kryptisch zu verwenden, schwer zu verstehen und im Allgemeinen außerhalb der Reichweite der großen ungewaschenen Personen wären, ohne dass das Insiderwissen vom Meister an Padwan weitergegeben würde, würde dies sicherstellen, dass es immer Arbeit für "Kenner" geben würde. Diese Philosophie zeigt sich im gesamten "RFC" -Konstrukt und in der blumigen Sprache, die in Personendokumenten verwendet wird. Diese zeigen Ihnen zwar technisch, wie Sie die Werkzeuge verwenden, waren jedoch nur dazu da, die Anforderung zu erfüllen, die Werkzeuge dokumentiert zu haben. wenig hat sich geändert.
synchronisiert
184

Sie können entweder "=" oder "==" Operatoren für den Zeichenfolgenvergleich in bash verwenden. Der wichtige Faktor ist der Abstand innerhalb der Klammern. Die richtige Methode besteht darin, dass Klammern Abstände enthalten und Operatoren Abstände 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 einfache 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!

Vyke
quelle
12

Es scheint, dass Sie versuchen, Befehlszeilenargumente in Ihr Bash-Skript zu analysieren. Ich habe kürzlich selbst danach gesucht. Ich bin auf Folgendes gestoßen, von dem ich denke, dass es Ihnen beim Analysieren der Argumente helfen wird:

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

Ich fügte den Ausschnitt unten als tl hinzu; dr

#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

ioneyed
quelle