Wie führe ich eine Zeichenfolge mit Werten als Befehl in Bash aus?

Wie führe ich eine Zeichenfolge mit Werten als Befehl in Bash aus?

Hier ist mein kleiner Bash-Skriptausschnitt.

i=5
command='echo $i'
$command

Ich möchte, dass dieses Skript druckt 5, d. h., es soll „echo“ ausführen und „5“ drucken. Aber stattdessen druckt es immer weiter $i. Wie kann ich das also lösen?

Antwort1

Das wäre:

eval "$command"

Wenn Sie möchten, dass der Inhalt $commandals Shellcode ausgewertet wird.

Wenn Sie nicht garantieren können, dass $commandes nicht mit beginnt -(was evalin einigen Shells dazu führen würde bash, dass es als Option behandelt wird), möchten Sie möglicherweise Folgendes ausführen:

eval " $command"

stattdessen. Das zusätzliche Leerzeichen am Anfang hat keinen Einfluss auf die Art und Weise, wie der Befehl analysiert wird, und verhindert, $commanddass er als Option zu behandelt wird, evalwenn er mit beginnt -. eval -- "$command"würde auch in einigen Shells (einschließlich ) funktionieren, ist aber nicht POSIX (IIRC) und würde beispielsweise bashin oder der Bourne-Shell nicht funktionieren .dash

Beachten Sie, dass Ihr Name $commandwahrscheinlich lauten sollte:

command='echo "$i"'

Sofern Sie nicht beabsichtigt haben, $iSplit+Glob zu unterliegen

Eine möglicherweise bessere Möglichkeit, Code in „Variablen“ zu speichern, wäre die Verwendung von Funktionen:

mycommand() { echo "$i"; }

(verwenden Sie mycommandanstelle von command, da commandes sich bereits um einen vorhandenen Befehl handelt).

Wenn / / $commandist , variiert das Verhalten je nach Shell.breakcontinuereturn

Wenn Sie $commandeineeinfacher Befehl, das ist eine Liste von Wörtern, von denen das erste als der auszuführende Befehl mit der Liste der Wörter als Argumente nachgeschlagen wird. Sie würden eine Array-Variable verwenden:

command=('echo' '$i' "$i")
"${command[@]}"

Das würde ausführen echo, mit echound $idem Inhalt von $ials Argumente.

command='echo $i ;x /* '$i
$command

(mit dem Standardwert $IFS) ist die, die am wenigsten Sinn ergeben würde. Dort $commandwürde eine Zeichenfolge enthalten. Die erste $iwird so belassen, wie sie ist, die zweite erweitert (außerhalb der einfachen Anführungszeichen), und dann würde diese Zeichenfolge split+glob unterzogen (außerhalb der $commanddoppelten Anführungszeichen), was zu einer Anzahl von Wörtern führen würde, die alseinfacher Befehlwieder.

verwandte Informationen