我无法理解${!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
。这意味着,函数的参数不是路径,而是包含要打印的路径的变量的名称。
当使用//
代替代替时/
,所有出现的模式都将被替换。单斜杠仅替换第一次出现的斜杠。