Quoting
在變數中執行命令
常說變數在使用時要雙引號。
在以下範例中,我希望將命令
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