Wie sende ich eine Variable an ein Inline-Shell-Skript?

26

Ich führe das folgende Skript aus:

VAR="Test"
sh -c 'echo "Hello $VAR"'

Aber ich bekomme:

# ./test.sh
Hello

Wie kann ich die Variable VARmeines Skripts an die mit erstellte Shell senden sh -c '...'?

Matthieu Napoli
quelle

Antworten:

44

Verwenden exportSie diese Option , um eine Umgebungsvariable zu erstellen, oder übergeben Sie sie direkt an den Befehl.

VAR="Test" sh -c 'echo "Hello $VAR"'

VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'

Vermeiden Sie doppelte Anführungszeichen um den Shell-Code, um die Interpolation zu ermöglichen, da dies zu Sicherheitslücken bei der Befehlsinjektion führt, wie in:

sh -c "echo 'Hallo $ VAR'"

einen Neustart auslösen, wenn er aufgerufen wird, wenn er $VARetwas wie enthält';reboot #

Ignacio Vazquez-Abrams
quelle
Nicht wirklich praktisch (ich habe mehrere Variablen, und ich möchte nicht, dass sie Umgebungsvariablen sind), aber es funktioniert, danke!
Matthieu Napoli
3
@Matthieu: Sie werden nur dann als Umgebungsvariablen für die untergeordneten Elemente Ihres Prozesses festgelegt , wenn Sie sich darüber Sorgen machen.
Piskvor
5
Nur zu Ihrer Information, Sie können auch export var="Test"in einer Zeile tun .
User606723
@Piskvor na danke für die präzision, das ist dann perfekt.
Matthieu Napoli
9

Hier ist noch eine andere Möglichkeit, Variablen sh -c(als Positionsargumente) zu übergeben:

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
ben
quelle
1
(+1) Um die normale Erwartung von $ 1 $ 2 für Skriptvariablen besser zu erfüllen, kann ein Dummy-Wert für $ 0 verwendet werden. Dies ermöglicht es $@, wie erwartet zu arbeiten, z. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
Peter.O
2
@ Peter.O Anstatt "_" zu verwenden, würde ich "sh" oder einen vernünftigen Namen für diesen Befehl verwenden, da dies $0in den Fehler- / Warnmeldungen der Shell angezeigt wird.
Stéphane Chazelas
5

Wenn Sie sie nicht als Umgebungsvariablen exportieren möchten, können Sie hier einen Trick ausführen. Speichern Sie Ihre Variablendefinition in einer Datei .var_init.shund geben Sie sie wie folgt in Ihre Sub-Shell ein:

.var_init.sh

VAR="Test"

von der Kommandozeile:

sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'

Auf diese Weise legen Sie Ihre Variablen nur bei der Ausführung Ihrer Subshell fest.

rahmu
quelle
... oderENV=.var_ini.sh sh -c '...'
Kusalananda
Beachten Sie, dass, wenn .var_init.sherwartet wird, dass dies im aktuellen Verzeichnis gesucht wird (im Gegensatz zu $PATH), dies geschrieben werden sollte. ./var_init.sh
Stéphane Chazelas,