首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么分词和文件名扩展不适用于`[.]]‘中的条件表达式?

为什么分词和文件名扩展不适用于`[.]]‘中的条件表达式?
EN

Unix & Linux用户
提问于 2016-03-16 21:18:15
回答 2查看 472关注 0票数 0

来自Bash参考手册

“分词规则”部分:

shell扫描参数展开、命令替换和算术扩展的结果,这些结果没有出现在双引号内,用于分词。

来自Filename展开部分的规则:

在分词后,除非设置了-f选项(请参阅4.3.1 集建,第58页),否则Bash会扫描每个单词的字符“*”、“?”和“[”。如果出现其中一个字符,则该单词被视为模式,并替换为与模式匹配的按字母排序的文件名列表。

因此,在参数展开、命令替换和算术扩展之后,除非对双引号中的部分进行分词,否则会发生分词现象。

  1. [[ ... ]]中,贾尔斯John1024都说单词拆分和文件名扩展不适用于[[ ... ]]中的条件表达式。“Bash参考手册”或“POSIX 7规范”中的哪些规则控制这一点?
    • [[ ... ]]中的条件表达式不是双引号,那么为什么不应用分词呢?
    • 没有设置-f选项。为什么文件名扩展也不适用?

  2. 除了[[ ... ]]之外,还有其他情况不适用于分词、文件名扩展或两者都适用吗?他们的原因是两者中的一个或两个不适用于[[..]]吗?
  3. 分词和文件名扩展总是并驾齐驱吗?也就是说,它们要么都适用,要么都不适用于每种情况?
EN

回答 2

Unix & Linux用户

发布于 2016-03-16 21:31:56

在[ [[命令的文档](https://www.gnu.org/software/bash/manual/bashref.html#index-_005b_005b)中,您将看到

不对[和]之间的单词执行分词和文件名展开;执行倾斜展开、参数和变量展开、算术扩展、命令替换、进程替换和移除引号。

(强调地雷)

此外,case语句也有豁免

在尝试匹配之前,该词经历了倾斜扩展、参数扩展、命令替换、算术扩展和引号删除。每个模式都经历了倾斜扩展、参数扩展、命令替换和算术扩展。

值得注意的是,它们的缺失是分词和文件名扩展。

此外,变量赋值(参见壳参数)

如果不给变量赋值,则可以通过表单name=[value]的语句为变量赋值为空字符串。所有值都经历了倾斜展开、参数和变量展开、命令替换、算术展开和移除引号。

所以这是安全的:

代码语言:javascript
运行
复制
a="hello world"
b=$a

未进行分词的其他地方:

我的窍门:在bash手册中搜索“接受”这个词。

票数 5
EN

Unix & Linux用户

发布于 2016-03-16 21:29:04

[[]]中的单词是一个扩展,bash使用它(除其他外)提供正则表达式:

还有一个二进制运算符‘=~’是可用的,其优先级与‘==’和‘!=’相同。当使用它时,操作符右边的字符串被视为扩展正则表达式,并相应地进行匹配(如在regex3中)。

在正则表达式上进行文件名扩展是没有帮助的,因为两者都将相同的*?元字符用于不同的目的。

进一步读:

  • 3.2.4.2条件结构 (Bash参考手册)
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/270298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档