操作符¶
shell中常用的操作符有
0x00 引用操作符¶
引用操作符如下
变量引用:引用变量值,两者等效
$variable
${variable}
命令引用:引用命令的执行结果
`command`
$(command)
字符引用:引用字符串值
''
:强引用,该操作符的优先级大于$
,即不会进行变量替换,直接引用显示全部字符""
:弱引用,该操作符的优先级小于$
,即先进行变量替换,然后再引用显示全部字符
0x0200 整数条件测试¶
组成整数条件测试表达式的操作符有
-eq
:等于-ne
:不等于-le
:小于等于-ge
:大于等于-lt
:小于-gt
:大于
执行整数条件测试表达式的操作符有
[ 整数条件测试表达式 ]
:前后有空格[[ 整数条件测试表达式 ]]
:前后有空格
0x0201 字符条件测试¶
组成字符条件测试表达式的操作符有
>
:大于<
:小于==
:等于,等值比较=~
:左侧是字符串,右侧是一个模式,判断左侧的字符串能否被右侧的模式所匹配:但是必须在[[]]
中执行模式匹配。模式中可以使用行首、行尾锚定符,但是模式不要加引号,有时候可能不需要转义!=
,<>
:不等于-n
: 判断字符串是否不空,不空为真,空则为假-z
:判断字符串是否为空,空则为真,不空则假
执行字符条件测试表达式的操作符有
[ 字符条件测试表达式 ]
:前后有空格[[ 字符条件测试表达式 ]]
:前后有空格
0x0202 文件条件测试¶
组成文件条件测试表达式的操作符有
-e file
:测试文件是否存在-a file
:测试文件是否存在-f file
:测试是否为普通文件-d directory
: 测试是否为目录文件-b file
:测试文件是否存在并且是否为一个块设备文件-c file
:测试文件是否存在并且是否为一个字符设备文件-h|-L file
:测试文件是否存在并且是否为符号链接文件-p file
:测试文件是否存在并且是否为管道文件:-S file
:测试文件是否存在并且是否为套接字文件:-r file
:测试其有效用户是否对此文件有读取权限-w file
:测试其有效用户是否对此文件有写权限-x file
:测试其有效用户是否对此文件有执行权限-s file
:测试文件是否存在并且不空file1 -nt file2
:测试file1是否比file2更new一些file1 -ot file2
:测试file1是否比file2更old一些
执行文件条件测试表达式的操作符有
[ 文件条件测试表达式 ]
:前后有空格[[ 文件条件测试表达式 ]]
:前后有空格
0x03 逻辑操作符¶
逻辑操作符有
逻辑与
&&
真 && 真 = 真
真 && 假 = 假
假 && 真 = 假
假 && 假 = 假
逻辑或
||
真 || 真 = 真
真 || 假 = 真
假 || 真 = 真
假 || 假 = 假
逻辑非
!
!真 = 假
!假 = 真
注意:各种编译语言对逻辑真、假的定义不同,在shell中,状态值为0代表真,状态值为非0代表假
0x04 括号操作符¶
括号操作符有以下几种
()
命令组
:括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用;括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格,即(cmd1;cmd2;cmd3)
命令替换
:等同于`cmd`
,shell扫描一遍命令行,发现了$(cmd)
结构,便将$(cmd)
中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,例如tcsh
数组初始化
:用来初始化数组
(())
执行算术表达式
:这种算术表达式是整数型的计算,不支持浮点型执行进制运算
:$((16#5f))
结果为95(16进位转十进制)重定义变量值
:a=5;((a++))
结果a被重定义为6算术运算比较
:双括号中的变量可以不使用$符号前缀,括号内支持多个表达式用逗号分开;比如可以直接使用for((i=0;i<5;i++))
[]
执行测试表达式
:前后有空格执行算术表达式
:前后没有空格
[[]]
执行测试表达式
:前后有空格
{}
命令组
:括号中的命令将会在当前shell顺序执行,所以括号中的变量能被脚本余下的部分使用;括号中多个命令之间用分号隔开,最后一个命令后必须有分号,并且第一条命令和左括号之间必须用空格隔开,即{ cmd1;cmd2;cmd3;}
变量引用
:${}
生成列表
:{a..d}.txt
表示a.txt
、b.txt
、c.txt
、d.txt
;在括号中,不允许有空白,除非这个空白被引用或转义扩展
:{a,b}.txt
表示a.txt
和b.txt
;在括号中,不允许有空白,除非这个空白被引用或转义