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循环格式;
运算符 | 说明 |
---|---|
++ | 自增运算 |
-- | 自建运算 |
! | 逻辑求反 |
~ | 位求反 |
** | 幂运算 |
<< | 左位移 |
>> | 右位移 |
& | 位布尔和 |
| | 位布尔或 |
&& | 与运算 |
|| | 或运算 |