linux shell中各种分号和括号,bash命令组:为什么花括号需要分号?

rici..

24

因为它们只是命令中的第一个单词{而}被识别为特殊语法.

这里有两个重点,这两点都可以在bash手册的定义部分找到.首先,是元字符列表:

metacharacter

一个字符,当不加引号时,分隔单词.元字符是空格或以下字符之一:'|','&',';','(',')',''.

该列表包括括号但不包括大括号(既不是卷曲也不是方形).请注意,它不是具有特殊含义的字符的完整列表,但它是一个完整的字符列表,用于分隔标记.所以{并且}不要分开令牌,并且只有当它们与元字符(例如空格或分号)相邻时才会被认为是令牌.

虽然大括号不是元字符,但它们在参数扩展(例如${foo})和大括号扩展(例如foo.{c,h})中由shell专门处理.除此之外,它们只是普通人物.{ab}例如,命名文件没有问题,或者}{,因为这些单词不符合参数扩展(需要在$之前{)或大括号扩展(在{and 之间至少需要一个逗号})的语法.就此而言,您可以使用{或}作为文件名而无需引用符号.同样,你可以调用一个文件if,done或者time无需考虑引用的名称.

后面这些代币是"保留字":

reserved word

一个对shell有特殊意义的词.大多数保留字引入shell流控制结构,例如for和while.

bash手册不包含保留字的完整列表,这是不幸的,但它们当然包括Posix指定的:

! { }

case do done elif else

esac fi for if in

then until while

以及bash(以及其他一些shell)实现的扩展:

[[ ]]

function select time

这些单词与内置函数(例如[)不同,因为它们实际上是shell语法的一部分.内置函数可以实现为函数或shell脚本,但保留字不能,因为它们改变了shell解析命令行的方式.

保留字有一个非常重要的特征,它实际上没有在bash手册中突出显示,但在Posix中非常明确(从中除了以下列出了保留字的上述列表time):

这种识别[作为保留字]只有在没有引用任何字符时以及当该字用作:

命令的第一个字......

(识别保留字的地方的完整列表稍长,但上面是一个非常好的总结.)换句话说,保留字只有在它们是命令的第一个字时才被保留.而且,由于{和}保留字,他们只是特殊的语法,如果他们在一个命令的第一个字.

例:

ls } # } is not a reserved word. It is an argument to `ls`

ls;} # } is a reserved word; `ls` has no arguments

我可以写很多关于shell解析的内容,特别是bash解析,但它会很快变得乏味.(例如,关于何时#开始评论以及何时只是普通字符的规则.)近似摘要是:"不要在家里试试"; 实际上,唯一可以解析shell命令的是shell.并且不要试图理解它:它只是一个随机的任意选择和历史异常的集合,很多但不是全部基于不用新功能打破古代shell脚本的需要.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值