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

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

這是我的 bash 腳本小片段。

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

我希望這個腳本打印5ie,我希望它運行 echo 並打印 5 $i。那我該如何解決這個問題呢?

答案1

那將是:

eval "$command"

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

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

eval " $command"

反而。額外的前導空格不會影響命令的解析方式,並且$command如果eval它以-.eval -- "$command"也可以在某些 shell(包括bash)中工作,但不是 POSIX (IIRC),並且不能在dashBourne shell 中工作。

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

command='echo "$i"'

除非你確實打算$i採用 split+glob

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

mycommand() { echo "$i"; }

(使用mycommand而不是command,因為它command已經是現有命令)。

如果$commandbreak// continuereturn行為將根據 shell 的不同而有所不同。

如果你想$command儲存一個簡單的指令,這是一個單字列表,其中第一個單字被查找為要以單字列表作為參數執行的命令,您可以使用數組變數:

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

這將運行echoecho$i的內容$i作為參數。

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

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

相關內容