Linux
`怎麼做!path//:/$′n′‘perrf_ormparameterexpansiontod我是____!p一個噸H//:/$′n′‘p和rF○r米p一個r一個米和噸和r和Xp一個ns一世○n噸○d一世spl一個是{!path//:/$…
我很難理解
${!path//:/$'\n'}
下面的 shell 函式是如何工作的。我已經查看
man bash
並考慮使用${parameter/pattern/string}
to 代替:
,\n
但在這種情況下,擴展以${!
? 另外,為什麼使用兩個正斜杠path//
而不是一個?pathprint () { if (($# == 0)); then set -- PATH fi for path; do echo "$path" echo "${!path//:/$'\n'}" done }
最後,為什麼下面的“簡化”不起作用?
pathprint () { echo "PATH" echo "${!PATH//:/$'\n'}" done }
在這種情況下,
$PATH
在參數擴展之前擴展,並bash
抱怨不存在具有目前值的名稱的參數$PATH
?
for path; do
沒有指定in
,這意味著它遍歷位置參數。如果呼叫函式時沒有指定, $ # will be zero and $ 1 將設置為字元串PATH
。
${!path}
展開到名稱為 in 的變數的內容$path
。這意味著,函式的參數不是路徑,而是包含要列印的路徑的變數的名稱。當使用
//
而不是/
替換時,所有出現的模式都會被替換。單斜杠僅替換第一次出現。