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

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

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

我已经查看man bash并考虑过使用${parameter/pattern/string}来代替:with \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

答案1

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

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

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

相关内容