我看到一个 shell 函数将 dir 改为 $upto。
upto() {
cd "${PWD/\/$upto\/*//$upto}"
}
但我不明白"${PWD/\/$upto\/*//$upto}"
。有人能解释一下吗?
答案1
简短的回答?事实证明,你可以对变量进行很多操作,而不仅仅是像插入变量那样简单地插入它们$PWD
。引用自bash 参考手册:
${parameter/pattern/string}
这图案被扩展以产生一个模式,就像文件名扩展一样。范围被扩展,并且最长的匹配是图案其值被替换为字符串。如果图案以 ' ' 开头
/
,所有匹配图案被替换为字符串。通常只替换第一个匹配项。如果图案以 '#
' 开头,它必须匹配扩展值的开头范围。 如果图案以 '%
' 开头,它必须匹配扩展值的末尾范围。 如果细绳为空,匹配图案被删除,以下/
内容图案可以省略。如果范围为 '@
' 或 '*
',则依次对每个位置参数应用替换操作,扩展为结果列表。如果范围@
是一个以' '或' '为下标的数组变量*
,对数组的每个成员依次进行替换运算,扩展为结果列表。
因此,在这个例子中:${PWD/\/$upto\/*//$upto}
- 范围是
PWD
。 - 图案是
/$upto/*
(这就是反斜杠的用途,为了保持斜杠在图案避免过早结束模式,并避免开启“替换所有匹配”行为,这通常会从图案以斜线开头) - 细绳是
/$upto
因此,这将查看变量$PWD
(shell 将其作为当前目录进行维护),在其中找到第一个被$upto
斜杠包围的目录名的位置(因此设置$upto
为“ dog
”将找不到名为“ dogfood
”的目录),然后用“ ”替换该位置和当前目录的其余部分/$upto
。