Variablendefinition in 'sh -c'

7

Ich habe versucht, eine Variable in einer 'sh -c'-Befehlszeichenfolge zu definieren:

sh -c "TMP=??; echo $TMP;"

Es wurde nichts gedruckt.

Warum kann ich keine Variable in einer 'sh -c'-Zeichenfolge definieren?

Gwangmu Lee
quelle
Es funktioniert perfekt in meiner Umgebung. Welches Betriebssystem verwenden Sie und welche Version von Bash?
mrc02_kr
1
@ mrc02_kr Es würde nur funktionieren, wenn $TMPes ??vor dem Ausführen der Zeile ist.
Kusalananda

Antworten:

13
sh -c 'TMP=??; echo $TMP;'

Bei Verwendung von doppelten Anführungszeichen erfolgt die Parametererweiterung, wenn die Befehlszeile erstellt wird, dh die Shell wird nicht angezeigt

TMP=??; echo $TMP;

als Parameter aber

TMP=??; echo ;

if $TMPist in der aufrufenden Shell-Umgebung leer.

Hauke ​​Laging
quelle
6
Beachten Sie auch, dass Sie??sh -c 'TMP=??; echo "$TMP"'
Stéphane Chazelas
Mir wurde klar, dass ich keine Wertschätzung hinterlassen hatte. Vielen Dank, es hat sehr geholfen: D
Gwangmu Lee
9
sh -c 'TMP=??; echo "$TMP"'

Mit doppelten Anführungszeichen um den sh -cCode wird der $TMPdurch die interaktive Shell erweitert, bevor der sh -cCode ausgeführt wird. Mit einfachen Anführungszeichen $TMPwird innerhalb der shShell erweitert. (Ich habe auch die $TMPvariable Erweiterung für richtig zitiert echo).

Einfache Anführungszeichen schützen eine Zeichenfolge vor variablen Erweiterungen.

Wenn Sie nicht beabsichtigen, das ??Muster innerhalb des sh -cSkripts als Dateinamen-Globbing-Muster zu behandeln , verwenden Sie

sh -c 'TMP="??"; echo "$TMP"'
Kusalananda
quelle