2017-04-07 10 views
0

Ich habe 2 Bash-Skripte. Einer ruft einen anderen an.Unterschied zwischen Bash-Variable

Caller.sh

arg1="+hcpu_extra=111 bbb" 
str="-y +hcpu_extra=111 bbb" 

local cmd_re="(-y)(.*)" 

if [[ $str =~ $cmd_re ]] 
then 
    opt=${BASH_REMATCH[1]} 
    arg=${BASH_REMATCH[2]} 
    echo "matched $opt" 
    echo "matched $arg" 
fi 


./callee.sh -y $arg 
## ./callee.sh -y $arg1 

fand ich, wenn ich $ arg1 und $ arg zu drucken, zeigen sie den gleichen Wert "+ hcpu_extra = 111 bbb" auf dem Bildschirm. Aber wenn ich sie an die callee.sh als Argument übergeben. Ich habe unterschiedliche Ergebnisse. Also meine Frage ist, was ist der Unterschied zwischen $ arg und $ arg1 aus Sicht des Bash-Interpreters? .

+1

Und was sind die verschiedenen Ergebnisse, die Sie in callee.sh bekommen? Ich nehme an, du meinst, du echo $ 2 'in 'callee.sh' – Arash

+0

$ arg beginnt mit einem Leerzeichen, nicht? – Robin479

Antwort

0

Zuerst wird der Code nicht richtig funktionieren, wie geschrieben, weil local kann nicht in einer Funktion verwendet werden.

Wenn Sie die local oder diese in einer Funktion, der einzige Unterschied zwischen arg und arg1 ist, dass arg beginnt mit einem Leerzeichen entfernen (die, die zwischen „-y“ und „+ HCPU“. Aber da Sie war‘ Wenn Sie diese Variablen ohne doppelte Anführungszeichen um sie herum erweitern, werden diese entfernt, es sei denn, Sie haben IFS in etwas geändert, das kein Leerzeichen enthält

(BTW, variable Referenzen ohne doppelte Anführungszeichen und Änderungen an IFS sind beide Dinge, die seltsame Effekte haben können, und am besten vermieden werden, wenn möglich.)

Wie auch immer, meine Zusammenfassung ist: die Der angegebene Code zeigt nicht den von Ihnen beschriebenen Effekt. Sie scheinen etwas Wichtiges ausgelassen zu haben. Siehe How to create a Minimal, Complete, and Verifiable example.

+0

Sie haben Recht. Das Code-Snippet stammt aus einer Funktion. Double-Anführungszeichen ist nicht immer eine gute Wahl zu gehen. –