我正在尝试使用 Bash 参数扩展来修改命令替换或其他参数扩展的输出。
以下嵌套扩展在 Zsh 中运行良好;但会导致 Bash 中出现“错误替换”错误:
${${PWD##*/}//trunk/latest}
或者
${$(basename $PWD)//trunk/latest}
输出应该是 的最后一个文件夹$PWD
,替换为latest
当我的当前目录是trunk
所以/home/user/trunk
应该成为latest
是否有 Bash 等效项允许在不依赖变量或管道的情况下进行链式扩展?或者 Bash 扩展只允许输入是字符串或普通变量?
答案1
不,替换运算符的嵌套是zsh
.
注意,用zsh
like with (t)csh
,也可以这样做${PWD:t:s/trunk/latest/}
。
虽然bash
也支持用于历史扩展的 csh 历史修饰符,但它不支持它们的参数扩展。
这里bash
使用临时变量:
var=${PWD##*/} var=${var//trunk/latest}
答案2
用 bash 试试这个:
[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"
或使用一个命令:
[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]
结果是在${BASH_REMATCH[1]}
答案3
你想要...?
PWD=latest
我没有看到满足您要求的方法。如果你想用最新的替换所有$PWD
- 尽管最好的方法是cd
最新的。
[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -
...这将带您到最新版本并将路径名打印到标准输出。你可以通过再次做来回到原来的地方cd -
。您可以使用以下命令执行相同的操作$CDPATH
:
mkdir -p /tmp/{1..5} ; \
CDPATH=/tmp cd 3; cd -; \
echo "${CDPATH:-empty or unset::}" "$OLDPWD"
/tmp/3
/home/mikeserv
empty or unset:: /tmp/3