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?


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.


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"'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.