Bash

如何在bash中將帶有值的字元串作為命令執行?

  • April 7, 2017

這是我的小 bash 腳本片段。

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

我希望這個腳本列印5,即,我希望它執行 echo 並列印 5。但它反而繼續列印$i。那麼我該如何解決這個問題呢?

那將是:

eval "$command"

如果您希望將 的內容$command評估為 shell 程式碼。

如果您不能保證它$command不會開始-(這會導致eval在某些 shell中將bash其視為一個選項),您可能需要執行:

eval " $command"

反而。額外的前導空格不會影響命令的解析方式,並且會阻止將$command其視為以 .eval開頭的選項-eval -- "$command"也可以在某些 shell(包括bash)中工作,但不是 POSIX (IIRC),並且不能在dash例如 Bourne shell 中工作。

請注意,您$command可能應該是:

command='echo "$i"'

除非你確實打算$i受到 split+glob

將程式碼儲存在“變數”中的一種可能更好的方法是使用函式:

mycommand() { echo "$i"; }

(使用mycommand代替command,command已經是現有命令)。

如果$commandbreak// continuereturn則行為會因外殼而異。

如果您想$command儲存一個簡單的命令,即單詞列表,其中第一個被查找為以單詞列表作為參數執行的命令,您將使用數組變數:

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

那將執行, echowith和 content of作為參數。echo``$i``$i

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

(預設值為$IFS)是最沒有意義的那個。在那裡,$command將包含一個字元串。第一個$i保持原樣,第二個擴展(在單引號之外),然後該字元串將受到 split+glob ($command不在雙引號內),其結果將導致多個單詞,取再次作為一個簡單的命令

引用自:https://unix.stackexchange.com/questions/356534