首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash字分裂机制

Bash字分裂机制
EN

Stack Overflow用户
提问于 2013-08-28 21:08:12
回答 3查看 3.7K关注 0票数 3

我是新来的巴什,我看到有自动分词,由巴什:

代码语言:javascript
复制
a="1  2     3 4"

如果我重复echo $a的"a“,我就得到了1 2 3 4,它已经隐式地进行了分词。如果循环遍历"a",则分别得到1、2、3和4。

我还从这里上读到

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

我还发现如果我有

代码语言:javascript
复制
b=$a;
echo "$b"

我会得到

代码语言:javascript
复制
"1 2 3 4"

所以,我的问题是:分裂这个词什么时候完成?它会改变字符串本身吗?它是否只在我使用echofor (循环)时生效?

更普遍地说,bash是如何处理它的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-28 21:14:58

man bash。关于任务,上面写着

所有的值都经历了倾斜展开、参数和变量展开、命令替换、算术扩展和移除引号。除"$@“外,不执行分词,如下所示,在特殊参数下进行解释。不执行路径名称展开。

[[ ]]条件下也不会发生分词:

[和]之间的单词不执行分词和路径名展开。

票数 2
EN

Stack Overflow用户

发布于 2013-08-28 21:25:51

实际上有几轮分词。第一个步骤是在解析命令行之前执行的,因此echo $a被分成两个单词echo$a。(这就是为什么像a="echo foo | wc -l"; $a这样的东西不执行管道;解析在展开$a之前已经完成)。在这一轮分字结束后,参数展开将产生两个字符串,echo1 2 3 4。由参数展开产生的字符串本身经历分字,因为它没有被引用,从而产生了4个额外的单词1234

在for循环中,列表中的项受分字限制:

代码语言:javascript
复制
for b in $a; do

展开(在分字产生forbin$a;do之后)到forbin1 2 3 4;do。同样,由参数扩展产生的字符串将经历分词到1234

票数 5
EN

Stack Overflow用户

发布于 2013-08-28 21:32:33

在解析脚本或命令行时,Bash作为下一步工作:

  1. 句法分析与词法分析
  2. 扩展
    1. 支撑展开
    2. 转盘膨胀
    3. 可变展开
    4. 仿制品和其他替代物
    5. 命令替换
    6. 分字
    7. 文件名生成(全局)

  1. 删除引号

正如你所看到的,分裂这个词几乎在结尾,所以在例如算术导出之后,但是在文件名全局之前,删除引号是最后一步。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18498218

复制
相关文章

相似问题

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