2013-10-15 3 views
13

mein Problem:Pass leere Variable in bash

#!/bin/bash 

function testFunc(){ 
    echo "param #1 is :" $1 
    echo "param #2 is :" $2 
} 

param1="param1" 
param2="param2" 

testFunc $param1 $param2 

Auf diese Weise ist der Ausgang:

param #1 is : param1 
param #2 is : param2 

Aber wenn ich gesetzt param1 zu leeren String:

param1="" 

Dann ist der Ausgang ist das folgende:

param #1 is : param2 
param #2 is : 

Ich vermute das Problem ist, dass, wenn der erste Parameter leer ist, es nicht deklariert wird, so dass es tatsächlich nicht als Funktionsparameter übergeben wird.

Wenn das das Problem ist, gibt es eine Möglichkeit, eine Variable "leere Zeichenfolge" in bash zu deklarieren, oder gibt es eine Problemumgehung, um das erwartete Verhalten zu erhalten?

Hinweis: Es funktioniert wie erwartet, wenn ich die Funktion wie folgt aufrufen:

testFunct "" $param2 

Aber ich will sauber um den Code zu halten.

UPDATE:

entdeckte ich kürzlich die -u-Flag, das einen Fehler auslöst, falls eine ungebundene Variable über verwendet werden soll.

$ bash -u test.sh 
param #1 is : param1 
test.sh: line 5: $2: unbound variable 
+1

Reinigen sollte die Korrektheit nicht überschreiben. – chepner

+1

Sie bevorzugen es also, das richtige Durcheinander zu behalten, anstatt nach einer sauberen und korrekten Lösung zu suchen? – kupsef

+1

Wenn der Code falsch ist, wen interessiert es, wenn es sauber ist? Eine Parametererweiterung nicht zu zitieren, weil Sie denken, dass sie sauberer aussieht, ist falsch. – chepner

Antwort

25

Im ersten Fall rufen Sie das Skript mit testFunct param2. Daher versteht es param2 als den ersten Parameter.

Es ist immer empfehlenswert, Parameter in Anführungszeichen zu übergeben, um dies zu vermeiden (und um ehrlich zu sein, für mich ist es auf diese Weise sauberer). So können Sie nennen es

testFunct "$param1" "$param2" 

So eine leere Variable übergeben sagen Sie:

testFunct "" "$param2" 

ein Beispiel Siehe:

diese Funktion Gegeben:

function testFunc(){ 
    echo "param #1 is -> $1" 
    echo "param #2 is -> $2" 
} 

Nennen wir es auf verschiedene Arten:

+1

Einige würden argumentieren, dass im Idealfall sogar "$ 1" und "$ 2" im Befehl "echo" angegeben werden sollten. – user000001

+1

Und sie hätten recht. Danke @ user000001! – fedorqui

1

Eine weitere bewährte Methode besteht darin, die Anzahl der mit $ # übergebenen Parameter zu überprüfen.

Dies löst jedoch nicht das Problem eines leeren Parameters, wie würden Sie wissen, ob der Parameter param1 leer oder param2 leer ist. Daher sind beide Prüfungen gute Parameter.

+0

Lesen Sie den Update-Abschnitt meiner Frage, es bietet eine robustere Möglichkeit, diese Fehler zu erfassen. – kupsef