0%

shell语法简析

问题说明

在shell下遇到一个赋值的问题

1
2
3
[rancho ~]$ a=10
[rancho ~]$ demo$a=$(echo 123)
demo10=123: command not found

shell下的命令格式

shell下我们常用的命令格式如下:

1
2
3
var=value           #变量赋值,例如a=1
cmd [args] #命令执行,例如ls -l
>redirection #重定向,例如:>a.c

实际上,bash中的一个简单命令的完整格式如下:

1
var=value ... cmd args >redirection ...

一个完整的简单命令由三部分组成:变量赋值部分、命令和参数部分、重定向部分,只是很多时候我们会省略一些部分的内容。
其中:

  • 变量赋值和重定向可以有多个
  • 变量赋值必须在cmd前面,并且变量名必须符合bash要求的命令规则
    • 定义变量时,普通变量名是字母、数字、下划线的组合,且不能以数字开头
    • 调用变量时,在变量名前加$,shell有一部分特殊变量如$0 $1 $$

对于变量赋值:

  • 如果有变量赋值而没有命令执行部分,则变量赋值在当前shell下生效
  • 如果有变量赋值也有命令执行部分,则变量赋值只作用于改命令,对当前shell无影响
  • 如果变量名不符合bash的命令规范,则不认为是变量赋值语句,而是当作cmd部分

问题说明

demo$a不是一个有效的变量名,所以会当作cmd来执行,但是在执行之前会从左到右执行shell命令解析规则,得到demo10=123,之后将其作为命令进行执行,找不到改命令从而报错。类似的,输入123das=10也会报这种错误。