我尝试在zsh
下运行代码
a=123
b="$a:r"
echo $b
我希望结果为123:r
,但事实证明是
123 # without ":r"
与字符t
,q
相同。
但是,如果我在bash
下运行它,它将为我带来预期的结果123:r
。
如果我添加{}
,则运行
a=123
b="${a}:r"
echo $b
这也带来了预期的结果。
有人知道这是怎么回事吗?
答案 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
中的内容严重冲突。您的结果可能会有所不同。)