`${!path//:/$'\n'}` 如何执行参数扩展以显示目录以换行符分隔的 $PATH?

Shu*_*eng 3 linux shell bash debian shell-script

我无法理解${!path//:/$'\n'}下面的 shell 函数是如何工作的。

我都对着man bash并认为使用${parameter/pattern/string}到替补多:\n,但在这种情况下,扩张开头${!?另外,为什么使用两个正斜杠path//而不是一个?

pathprint () {
   if (($# == 0)); then
      set -- PATH
   fi
   for path; do
      echo "$path"
      echo "${!path//:/$'\n'}"
   done
}
Run Code Online (Sandbox Code Playgroud)

最后,为什么下面的“简化”不起作用?

pathprint () {
      echo "PATH"
      echo "${!PATH//:/$'\n'}"
   done
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,$PATH在参数扩展之前扩展,并bash抱怨不存在具有当前值名称的参数$PATH?

cho*_*oba 5

for path; do不指定in,这意味着它迭代位置参数。如果您在调用函数时未指定任何内容,则 $# 将为零,而 $1 将设置为 string PATH

${!path}扩展到名称在 中的变量的内容$path。这意味着,函数的参数不是路径,而是包含要打印的路径的变量的名称。

当使用//代替/替代时,所有出现的模式都会被替换。单斜杠仅替换第一次出现。