操作符

shell中常用的操作符有

0x00 引用操作符

引用操作符如下

  • 变量引用:引用变量值,两者等效

    • $variable
    • ${variable}
  • 命令引用:引用命令的执行结果

    • `command`
    • $(command)
  • 字符引用:引用字符串值

    • '':强引用,该操作符的优先级大于$,即不会进行变量替换,直接引用显示全部字符
    • "":弱引用,该操作符的优先级小于$,即先进行变量替换,然后再引用显示全部字符

0x01 算术操作符

组成算术表达式的操作符有

  • ++=++
  • --=--
  • **=
  • /
  • 取余%%=

执行算术表达式的操作符有

  • $[算术表达式]
  • $((算术表达式))

0x02 条件测试操作符

条件测试有以下几种情况

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.txtb.txtc.txtd.txt;在括号中,不允许有空白,除非这个空白被引用或转义
    • 扩展{a,b}.txt表示a.txtb.txt;在括号中,不允许有空白,除非这个空白被引用或转义