首页 > 解决方案 > 在 zsh 下,字符串中带有 'r' 的冒号无法正常工作

问题描述

我尝试在下运行代码zsh

a=123
b="$a:r"
echo $b

我希望结果是123:r,但结果是

123 # without ":r"

字符也是一样的tq

但是,如果我在 下运行它bash,它会给我带来想要的结果123:r

如果我添加{},运行

a=123
b="${a}:r"
echo $b

这也带来了预期的结果。

有人知道这里发生了什么吗?

标签: shellzshoh-my-zsh

解决方案


在 zsh 中,与默认情况下"$a:r"相同"${a:r}"

引用文档(添加了重点):

${name}

替换参数名称的值(如果有)。如果扩展后跟不被解释为名称一部分的字母、数字或下划线,则需要大括号。此外,更复杂的替换形式通常需要大括号。仅当未设置选项 KSH_ARRAYS 时才适用的例外是单个下标或出现在 name 之后的任何冒号修饰符,或任何字符 '^'、'='、'~'、'#' 或 '+'出现在名称之前,所有这些都可以使用或不使用大括号。

:r修饰符的意思是

删除保留根名称的文件扩展名。没有文件扩展名的字符串不会被更改。文件扩展名是 '.' 后跟任意数量的既不是“.”的字符(包括零)。也不是 '/' 并且继续到字符串的末尾。例如,'foo.orig.c' 的扩展名是 '.c',而 'dir.c/foo' 没有扩展名。

要禁用此行为:

$ setopt KSH_ARRAYS

(注意:在我的设置中执行此操作实际上会导致 zsh 出现段错误;该选项会以多种方式改变行为,其中一种方式与我的 . 中的某些内容严重冲突.zshrc。您的结果可能会有所不同。)


推荐阅读