2017-03-02 1 views
0

während ein Skript zu schreiben ich das folgende Problem gefunden,unerwartetes Verhalten des Unix-Befehl echo

annehmen

set x = "param[xyz]"; 
echo $x 

der Ausgang war Echo: Kein Spiel

Aber wenn ich das tue,

Ich habe die Ausgabe: param [xyz]

so Echo eine Zweiweg Substitution tut, Zunächst echo $ x wurde umgewandelt Echo param [xyz] und dann versucht, es für die param [xyz] Wert zu suchen.

Aber im Idealfall sollte es nur die Variable gedruckt haben, was auch immer zur Verfügung gestellt wird. Ist dieses Verhalten ein gültiger Anwendungsfall?

Antwort

1

echo tut keine Substitution, es ist die Shell, die es tut. Es hängt von der Shell ab, die Sie verwenden, aber es scheint, dass Sie eine Shell der Familie der C-Shells verwenden. Shell erweitert Variablen in der Befehlszeile, so dass der erste Schritt ist, zu erzeugen:

[csh] echo param[xyz] 

und dann die Schale hat Expansionsdatei übereinstimmen, aber da es keine Datei, die die Schal Antworten auf das Muster entspricht, ist, dass es keine Spiel. Die Nachricht ist irgendwie irreführend, da die Shell Sie daran erinnert, was "Befehl" betraf und nicht, dass der Befehl selbst fehlgeschlagen ist.

Im zweiten Versuch verhindert das Einschließen der Variablen in ", dass die Shell eine andere Erweiterung ausführt, und die Shell startet den Befehl mit dem Argument, das nach der ersten Erweiterung erhalten wurde.

es eine weitere Prävention liegt vor, wenn Sie ' verwenden, wird die Schale nicht immer Variablen erweitern:

[csh] echo '$x' 
$x 

Siehe Dokumentation zu schälen und vor allem über Expansion.

Eine weitere Erfahrung zu überzeugen Sie mit einem nicht existierenden Befehl, um zu versuchen ist:

[csh] weirdo z* 
weirdo: No match 

, die als ein nicht existierenden Befehl ist anders:

[csh] weirdo 
weirdo: Command not found. 

Wenn Sie ein anderes Verhalten Shell würde verwenden würde, anders sein:

[bash] echo z* 
z* 

weil das Oberteil als Argument itse die Saite erzeugt Wenn die Dateiübereinstimmung nicht funktioniert.

mit:

[zsh] echo z* 
zsh: no matches found: z* 

das Verhalten c Schalen wesentlich ähnlich ist, aber die Nachricht viel mehr klar ist, scheiterte die Schale an Matching.

+0

Danke, habe das Konzept :) –