使用参数扩展来修改另一个扩展的输出

使用参数扩展来修改另一个扩展的输出

我正在尝试使用 Bash 参数扩展来修改命令替换或其他参数扩展的输出。

以下嵌套扩展在 Zsh 中运行良好;但会导致 Bash 中出现“错误替换”错误:

${${PWD##*/}//trunk/latest}

或者

${$(basename $PWD)//trunk/latest}

输出应该是 的最后一个文件夹$PWD,替换为latest当我的当前目录是trunk

所以/home/user/trunk应该成为latest

是否有 Bash 等效项允许在不依赖变量或管道的情况下进行链式扩展?或者 Bash 扩展只允许输入是字符串或普通变量?

答案1

不,替换运算符的嵌套是zsh.

注意,用zshlike 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

相关内容