Bash
為什麼 $HOME 不在這裡擴展 HOME 變數?
我寫了一個簡單的腳本。
read -p "Enter the path: " path echo "$path"
我給輸入為
$HOME
輸出是:
$HOME
如果我寫
echo "$HOME"
輸出
/home/sam
那麼為什麼不是前一種情況呢?
path
成為string$PATH
,而不是它的“解釋”。這種解釋只發生在特定的上下文中——例如,如果你在互動式 shell 命令提示符下鍵入“bare”;但絕對不在read
(否則你不能read
用來讀取包含 的文本文件$
,例如!)。請記住,擴展是您永遠不想在任何地方啟用的功能——它會使編寫將變數作為變數而不是內容傳遞的程序變得困難。因此,程式語言設計者(或者在 shell 的情況下,幾十年或多或少的有機開發)決定了這種擴展發生在哪裡,哪裡不發生。這裡沒有真正的“為什麼”:它是如何定義的。
如果你願意,你可以
eval value="$path"
,然後你就明白了。我不建議這樣做,因為它基本上使您的輸入成為 shell 提示,如果使用者輸入,例如,$(rm -rf /)
這將允許他們刪除所有內容……總而言之,我覺得這更像是一個軟體設計問題:你想讓使用者做什麼樣的事情?
在這種情況下,
$HOME
可能幾乎是您想要允許的唯一“特殊”情況。我建議將其替換為~
,因為它是規範的縮寫形式,並執行以下操作:read "Enter foo bar baz:" raw_path if [[ ( ! -d "${raw_path}" ) && "${raw_path:0:1}" = "~" ]]; then _path="${HOME}${raw_path:1:}" else _path="${raw_path}" fi