Shell_05_运算符
@
运算符
运算符分为:算数运算符、关系运算符、逻辑运算符、字符串运算符和文件测试运算符
1)使用运算符时,必须在运算符左右两边添加空格以隔开其他变量
命令运算符
关联系命令执行:两个命令之间存在依赖性(与、或)
| 命令执行情况 | |
|---|---|
| 命令1 && 命令2 | 若命令1成功执行,则开始执行命令2 | 
| 若命令1执行发生错误,则不执行命令2 | |
| 命令1 || 命令2 | 若命令1成功执行,则不执行命令2 | 
| 若命令1执行发生错误,则开始执行命令2 | 
1)命令是否执行成功就根据“$?”变量是否为0来判断
如:在/root/test/abc文件夹下创建文件test和test2

//不论/abc文件夹是否存在,都可以建立
算数运算符
假定有变量a和b,其值分别为10和20
| 运算符 | 说明 | 举例 | 
|---|---|---|
| + | 加法 | `expr $a + $b` 结果为 30。 | 
| - | 减法 | `expr $a - $b` 结果为 -10。 | 
| * | 乘法 | `expr $a \* $b` 结果为 200。 | 
| / | 除法 | `expr $b / $a` 结果为 2。 | 
| % | 取余 | `expr $b % $a` 结果为 0。 | 
| = | 赋值 | a=$b 将把变量 b 的值赋给 a | 
| = = | 用于比较两个数字 相同则返回 true(真) | [ $a == $b ] 返回 false(假) | 
| != | 用于比较两个数字 不相同则返回 true | [ $a != $b ] 返回 true | 
1)bash本身不支持算数运算,可通过awk、expr和bc来实现
2)通过中括号运算形式:[ $变量1 运算符 $变量2 ]
//若将运算结果赋于其他变量,还需在左中括号前添加$
expr命令:记录表达式计算所得的结果
指令格式:expr 值1 运算符 值2
1)仅能进行整数级别的运算
如:使用expr进行四则运算

//“*”运算符需通过“\”进行转义
中括号运算符
判断符号:中括号“[ ]”
指令格式:[ 检测表达式 ]
1)[ ]属于运算符,在使用时需在开头和末尾添加空格
2)中括号内的变量,最好使用双引号括起来
3)中括号内的常数,最好使用单/双引号括起来
| 检测参数 | 含义 | 解析 | 
|---|---|---|
| 1.关于文件的类型检测 | ||
| -e文件路径 | 检测文件(包括目录)是否存在 如果是,则返回 true | [ -e $file ] 返回 true | 
| -d 文件路径 | 检测文件是否是目录 如果是,则返回 true | [ -d $file ] 返回 false | 
| -f 文件路径 | 检测文件是否是普通文件 如果是,则返回 true | [ -f $file ] 返回 true | 
| -s文件路径 | 检测文件是否为空(文件大小) 不为空返回 true | [ -s $file ] 返回 true | 
| -p文件路径 | 检测文件是否为管道文件 如果是,则返回 true | [ -p $file ] 返回 false | 
| -b 文件路径 | 检测文件是否为块设备文件 如果是,则返回 true | [ -b $file ] 返回 false | 
| -c 文件路径 | 检测文件是否为字符设备文件 如果是,则返回 true | [ -c $file ] 返回 false | 
| -S 文件路径 | 检测文件是否为Socket文件 如果是,则返回 true | [ -c $file ] 返回 false | 
| 2.关于文件的权限检测 | ||
| -r文件路径 | 检测文件是否可读 如果是,则返回 true | [ -r $file ] 返回 true | 
| -w文件路径 | 检测文件是否可写 如果是,则返回 true | [ -w $file ] 返回 true | 
| -x文件路径 | 检测文件是否可执行 如果是,则返回 true | [ -x $file ] 返回 true | 
| -u文件路径 | 检测文件是否设置了 SUID 位 如果是,则返回 true | [ -u $file ] 返回 false | 
| -g 文件路径 | 检测文件是否设置了 SGID 位 如果是,则返回 true | [ -g $file ] 返回 false | 
| -k文件路径 | 检测文件是否设置了粘着位(Sticky Bit) 如果是,则返回 true | [ -k $file ] 返回 false | 
| 3.关于文件对比的检测 | ||
| -nt (new than) | 检测第一个是否比第二个文件新 如果新,则返回true | [ $file1 -nt $file2 ] | 
| -ot (old than) | 检测第一个是否比第二个文件旧 如果旧,则返回true | [ $file1 -ot $file2 ] | 
| -ef | 检测两个文件是否为同一个文件 如果同一文件,则返回true | [ $file1 -ef $file2 ] | 
| 4.关于整数的检测 | ||
| -eq (eaqul) | 检测两个数是否相等 相等返回 true | [ $a -eq $b ] 返回 false。 | 
| -ne (not equal) | 检测两个数是否相等 不相等返回 true | [ $a -ne $b ] 返回 true。 | 
| -gt (great than) | 检测左边的数是否大于右边的 如果是,则返回 true | [ $a -gt $b ] 返回 false。 | 
| -ge | 检测左边的数是否大于等于右边的 如果是,则返回 true | [ $a -ge $b ] 返回 false。 | 
| -lt (less than) | 检测左边的数是否小于右边的 如果是,则返回 true | [ $a -lt $b ] 返回 true。 | 
| -le | 检测左边的数是否小于等于右边的 如果是,则返回 true | [ $a -le $b ] 返回 true。 | 
| 5.关于字符串的检测 | ||
| -z | 检测字符串长度是否为0 为0返回 true | [ -z $c ] 返回 false | 
| -n | 检测字符串长度是否为0 不为0返回 true | [ -n $c ] 返回 true | 
| \> | 检测左边字符串是否大于右边字符串 大于返回true(根据ASCII) | [ $c \> $d ] 返回true | 
| \< | 检测左边字符串是否小于右边字符串 小于返回true(根据ASCII) | [ $c \< $d ] 返回false | 
| = = | 检测两个字符串是否相等 相等返回 true | [ $c = = $d ] 返回 false | 
| 6.关于多重条件检测 | ||
| -a (与运算) | 两个表达式都为 true 才返回 true | [ $a -lt 20 -a $b -gt 100 ] 返回 false | 
| -o (或运算) | 有一个表达式为 true 则返回 true | [ $a -lt 20 -o $b -gt 100 ] 返回 true | 
| ! (非运算) | 表达式为 true 则返回 false | [ ! false ] 返回 true | 
1)假定有变量a和b,其值分别为10和20
2)假定有变量c和d,其值分别为‘abc’和‘efg’
3)其中权限判断为或判断:三个身份中只要一个有,则认为true
test命令:对文件/数据进行指定的检测
指令格式:test 检测表达式
1)使用方法及效果都等同于中括号判断符号
如:对整数比较大小

//test和中括号并不能直接打印检测结果,需使用“$?”查看
双圆括号运算
双圆括号可在内括号中实现高级数学表达式
1)格式:(( 数学表达式 ))
2)数学表达式可以是任意数学赋值或比较表达式;
3)较多用于for循环,实现类似C语言的for循环格式;
| 运算符 | 说明 | 
|---|---|
| ++ | 自增运算 | 
| -- | 自建运算 | 
| ! | 逻辑求反 | 
| ~ | 位求反 | 
| ** | 幂运算 | 
| << | 左位移 | 
| >> | 右位移 | 
| & | 位布尔和 | 
| | | 位布尔或 | 
| && | 与运算 | 
| || | 或运算 | 
                    
                
                
            
        
浙公网安备 33010602011771号