字符串中带有'r'的冒号在zsh

时间:2019-04-10 04:19:00

标签: shell zsh oh-my-zsh

我尝试在zsh下运行代码

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

我希望结果为123:r,但事实证明是

123 # without ":r"

与字符tq相同。

但是,如果我在bash下运行它,它将为我带来预期的结果123:r

如果我添加{},则运行

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

这也带来了预期的结果。

有人知道这是怎么回事吗?

1 个答案:

答案 0 :(得分:0)

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

引用the documentation(添加了强调):

  

${name}

     

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

:r修饰符means

  

删除文件扩展名,保留根名。没有文件扩展名的字符串不会更改。文件扩展名是一个“。”,后跟任意多个字符(包括零),这些字符既不是“。”也不是“ /”,并且一直延续到字符串的末尾。例如,“ foo.orig.c”的扩展名是“ .c”,而“ dir.c / foo”没有扩展名。

要禁用此行为,请执行以下操作:

$ setopt KSH_ARRAYS

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