操作符¶
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;在括号中,不允许有空白,除非这个空白被引用或转义