shell - 在 zsh 下,字符串中带有 'r' 的冒号无法正常工作
问题描述
我尝试在下运行代码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
这也带来了预期的结果。
有人知道这里发生了什么吗?
解决方案
在 zsh 中,与默认情况下"$a:r"
相同"${a:r}"
。
引用文档(添加了重点):
${name}
替换参数名称的值(如果有)。如果扩展后跟不被解释为名称一部分的字母、数字或下划线,则需要大括号。此外,更复杂的替换形式通常需要大括号。仅当未设置选项 KSH_ARRAYS 时才适用的例外是单个下标或出现在 name 之后的任何冒号修饰符,或任何字符 '^'、'='、'~'、'#' 或 '+'出现在名称之前,所有这些都可以使用或不使用大括号。
:r
修饰符的意思是:
删除保留根名称的文件扩展名。没有文件扩展名的字符串不会被更改。文件扩展名是 '.' 后跟任意数量的既不是“.”的字符(包括零)。也不是 '/' 并且继续到字符串的末尾。例如,'foo.orig.c' 的扩展名是 '.c',而 'dir.c/foo' 没有扩展名。
要禁用此行为:
$ setopt KSH_ARRAYS
(注意:在我的设置中执行此操作实际上会导致 zsh 出现段错误;该选项会以多种方式改变行为,其中一种方式与我的 . 中的某些内容严重冲突.zshrc
。您的结果可能会有所不同。)
推荐阅读
- json - 如何将变量(&id)从一个 api 传递到另一个 api 以获取相应的数据?
- ocr - 如何使用 Google Cloud Vision API 读取一列文本
- fabric - 在结构中提示密码时跳过主机
- django - 在 Django 模型中使用属性值作为选择
- bash - 可以覆盖 bash 环境变量完成吗?
- kubernetes - Kubernetes runAsNonRoot 失败:CreateContainerConfigError
- sql - 确定样本是否包含多个 ID 的 0 行
- sql - 在 INSERT 中,如何使空值为零或空?
- vue.js - 访问 Label 的 nativeView
- python - 如何在 Reg Ex 中进一步缩小搜索条件?