Quoting

在變數中執行命令

  • May 6, 2019

常說變數在使用時要雙引號。

在以下範例中,我希望將命令echo "You can't see me"放在變數中並以輸出為You can't see me. 這是最終目標。

$ cmd="echo \"You can't see me\""
$ echo "$cmd"
echo "You can't see me"
$ $cmd
"You can't see me"
$ "$cmd"
echo "You can't see me": command not found

所以$cmd跑了,它包含了我不想有的雙引號,並且遵循雙引號變數的建議導致了一個錯誤。

儘管資源表明它們總是應該被使用,但該建議是否有例外?

我知道如何通過執行eval "$cmd"(或不帶雙引號)或通過在執行後對輸出進行適當的轉換$cmd(不帶雙引號)來獲得我想要的結果,但是我該如何避免這個問題呢?

人們常說…

資源說的事實…

不要盲目聽從“建議”;沒有辦法“正確”地進行貨物崇拜程式。是否有一些主要的“資源”,例如 bash(1) 聯機幫助頁或標準規範?

如果要將字元串評估為腳本片段,則應使用eval. 這就是它的用途:

cmd="echo \"You can't see me\""
eval "$cmd"

當您使用不帶引號的變數時,將不會再次掃描其擴展以查找單引號或雙引號等 shell 元字元並重新解析,而只會根據IFS變數中的字元進行拆分並進行全域擴展(如果它包含任何*,?[字元):

cmd="echo \"What's a *? \""

eval "$cmd"
What's a *?

$cmd
"What's a [all the files in your directory] "

在最後一個範例中,cmd將展開,然後拆分為echo, "What's,和a,將glob 展開,然後 將所有其他字元串作為參數執行,並將它們以空格連接列印到標準輸出(以及在某些 shell ,也將在其論點中解釋和其他轉義)。*?``"``*?``echo``echo``\n

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