Linux

`怎麼做!path//:/$′n′‘perrf_ormparameterexpansiontod我是____!p一個噸H//:/$′n′‘p和rF○r米p一個r一個米和噸和r和Xp一個ns一世○n噸○d一世spl一個是{!path//:/$…

  • February 15, 2021

我很難理解${!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。這意味著,函式的參數不是路徑,而是包含要列印的路徑的變數的名稱。

當使用//而不是/替換時,所有出現的模式都會被替換。單斜杠僅替換第一次出現。

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