在linux中想做数学计算,直接操作数据运算可以得到如下结果:
可见linx更加偏向底层操作,没有高级语言那样的解释器。
linux提供两种运算符用于运算操作
变量名=$((运算式))
a=$((1+2))
echo $a #结果返回为3
#注意使用$[]的方式在[]内需要空格
变量名=$[ 表达式 ]
b=$[ 1 + 2 ]
echo $b #结果为3
算术运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为30 |
- | 减法 | expr $a - $b 结果为-10 |
* | 乘法 | expr $a * $b 结果为200 |
/ | 除法 | expr $b / $2 结果为2 |
% | 取余 | expr $b % $a 结果为0 |
= | 赋值 | a=$b 把变量b的值赋值给变量a |
== | 相等。 | 判断两个数字是否相等,相等则返回true [ $a == $b ] 返回true |
!= | 不相等。 | 判断两个数字是否相等,不相等则返回true [ $a != $b ] 返回true |
# 其实原生bash不支持简单的数学运算,但是可以通过其他命令来实现,
# 例如: awk 和 expr命令进行处理计算之后才可以得出结果,expr 最常用。
# expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
# 以下几点需要注意:
# 1.表达式和运算符之间要有空格。
# 例如: 5+10 是不对的,必须写成 5 + 10,这与我们熟悉的大多数编程语言不一样。
# 2.完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
# 3.乘号(*)前边必须加反斜杠(\)进行转义才能实现乘法运算。
#!/bin/bash
a=10
b=20
result=`expr $a + $b`
echo "a + b = $result"
# a + b = 30
result=`expr $a - $b`
echo "a - b = $result"
# a - b = -10
result=`expr $a \* $b`
echo "a * b = $result"
# a * b = 200
result=`expr $b / $a`
echo " b / a = $result"
# b / a = 2
result=`expr $b % $a`
echo "b % a = $result"
# b % a = 0
在[]中使用 | 在(()和[[]]中使用 | 说明 | 举例 |
---|---|---|---|
-eq | == | equal的缩写,表相等 | [ $a -eq $b ] 返回 false |
-ne | != | not equal的缩写,表不相等 | [ $a -nq $b ] 返回 true |
-gt | > | greater than的缩写,表大于 | [ $a -gt $b ] 返回 false |
-ge | >= | greater equal的缩写,表大于等于 | [ $a -ge $b ] 返回 false |
-lt | < | greater than的缩写,表小于 | [ $a -lt $b ] 返回 true |
-le | <= | greater equal的缩写,表小于等于 | [ $a -lq $b ] 返回 true |
提示:
# 1. "<"符号意思是小于,if [[ "$a" < "$b" ]] 是错误的,if [ "$a" \< "$b" ] (即在单[]中需要转义,因为shell也用 <和>表示重定向)。
# 2. ">"符号意思是大于,同上。
# 3. 关系运算符只支持数字(整数),不支持字符串,除非字符串的值是数字(整数)。
# 4. 条件表达式要放在方括号之间,并且要有空格,例如 [[$a==$b]] 是错误的,必须写成 [[ $a == $b ]]。
#!/bin/bash
a=5
b=10
if [ $a -eq $b ];then echo "eq 关系运算结果: a等于b" ;else echo "eq 关系运算结果: a不等于b"; fi
# eq 关系运算结果: a不等于b
if [ $a -ne $b ];then echo "ne 关系运算结果: a不等于b";else echo "ne 关系运算结果: a等于b"; fi
# ne 关系运算结果: a不等于b
if [ $a -gt $b ];then echo "gt 关系运算结果: a大于b";else echo "gt 关系运算结果: a小于等于b";fi
# gt 关系运算结果: a小于等于b
if [ $a -lt $b ];then echo "lt 关系运算结果:a小于b";else echo "lt 关系运算结果:a大于等于b";fi
# lt 关系运算结果:a小于b
if [ $a -ge $b ];then echo "ge 关系运算结果:a大于等于b";else echo "ge 关系运算结果:a小于b";fi
# ge 关系运算结果:a小于b
if [ $a -le $b ];then echo "le 关系运算结果:a小于等于b";else echo "le 关系运算结果:a大于b";fi
# le 关系运算结果:a小于等于b
在[ ]中使用 | 在(()和[[]]中使用 | 说明 | 举例 |
---|---|---|---|
赋值 | a=10 | b=25 | |
-a | && | 与运算,两个表达式都为true,才返回true | [ $a -lt 20 -a $b -gt 20 ] 返回true |
-o | || | 或运算,有一个表达式都为true,则返回true | [ $a -lt 20 -o $b -gt 100 ] 返回true |
! | ! | 非运算,表达式为true,则返回false | [ ! false ] 返回true |
小结:逻辑操作符使用总结
[ ]中用 -a,-o, !
[[ ]]中用 &&,||, !
test 用法和 [ ]相同
#!/bin/bash
a=5
b=10
if [ $a != $b ];then echo "!= 逻辑非运算结果:a不等于b";else echo "!=逻辑非运算结果: a等于b";fi
# != 逻辑非运算结果:a不等于b
if [ $a -lt 50 -a $b -gt 8 ];then echo "and 逻辑与运算结果:真";else echo "and 逻辑与运算结果:假";fi
# and 逻辑与运算结果:真
if [ $a -lt 50 -o $b -gt 12 ];then echo "or 逻辑或运算结果:真";else echo "or 逻辑或运算结果:假";fi
# or 逻辑或运算结果:真
if [ $a -lt 3 -o $b -gt 8 ];then echo "or 逻辑或运算结果:真";else echo "or 逻辑或运算结果:假";fi
# or 逻辑或运算结果:真
字符串运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等则返回true | [ $a = $b ] 返回true |
!= | 检测两个字符串是否相等,不相等则返回true | [ $a != $b ] 返回true |
-z | 检测字符串长度是否为0,为0则返回true | [ -z $b ] 返回true |
-n | 检测字符串长度是否为0,不为0则返回true | [ -n $b ] 返回true |
str | 检测字符串是否为null,不为null则返回true | [ $b ] 返回true |
#!/bin/bash
a="abcde"
if [[ "$a" == abc* ]]; then echo "abc开头"; else echo "不是"; fi
# abc开头
if [ "$a" == abc* ]; then echo "abc开头"; else echo "不是"; fi
# 不是
if [ "$a" = abc* ]; then echo "abc开头"; else echo "不是"; fi
# 不是
if [[ "$a" = abc* ]]; then echo "abc开头"; else echo "不是"; fi
# abc开头
b="abcde"
if [[ "$b" = "abc*" ]]; then echo "不相等"; else echo "不等"; fi
# 不等
if [[ "$b" == "abc*" ]]; then echo "不相等"; else echo "不等"; fi
# 不等
if [ "$b" == "abc*" ]; then echo "不相等"; else echo "不等"; fi
# 不等
if [ "$b" = "abc*" ]; then echo "不相等"; else echo "不等"; fi
# 不等
#!/bin/bash
a="cfe"
b="efr"
if [ "$a" = "$b" ]
then
echo "字符串a和字符串b相等"
else
echo "字符串a和字符串b不相等"
fi
if [ "$a" == "$b" ]
then
echo "字符串a和字符串b相等"
else
echo "字符串a和字符串b不相等"
fi
if [ "$a" != "$b" ]
then
echo "字符串a和字符串b不相等"
else
echo "字符串a和字符串b相等"
fi
if [ -z "$a" ]
then
echo "字符串a的长度为0,即字符串a为空?"
else
echo "字符串a的长度不为0"
fi
if [ -n "$a" ]
then
echo "字符串a的长度不为0"
else
echo "字符串a的长度为0,即字符串a为空?"
fi
if [ "$a" ]
then
echo "字符串a不为空"
else
echo "字符串不为空"
fi
# 输出结果
# 字符串a和字符串b不相等
# 字符串a的长度不为0
# 字符串a的长度不为0
# 字符串a不为空
文件测试运算符 | 说明 | 举例 |
---|---|---|
-b | 检测文件是否是块设备文件,如果是,则返回true | [ -b $file ] 返回true |
-c | 检测文件是否是字符设备文件,如果是,则返回true | [ -c $file ] 返回true |
-d | 检测文件是否是目录文件,如果是,则返回true | [ -d $file ] 返回true |
-f | 检测文件是否是普通文件(既不是目录也不是设备文件),如果是,则返回true | [ -f $file ] 返回true |
-g | 检测文件是否设置了SGID位,如果是,则返回true | [ -g $file ] 返回true |
-k | 检测文件是否设置了粘着位(stucky Bit),如果是,则返回true | [ -k $file ] 返回true |
-p | 检测文件是否具名管道,如果是,则返回true | [ -p $file ] 返回true |
-u | 检测文件是否设置了SUID位,如果是,则返回true | [ -u $file ] 返回true |
-r | 检测文件是否可读,如果是,则返回true | [ -r $file ] 返回true |
-w | 检测文件是否可写,如果是,则返回true | [ -w $file ] 返回true |
-x | 检测文件是否可执行,如果是,则返回true | [ -x $file ] 返回true |
-s | 检测文件是否为不为空(文件大小是否不为0),如果不为0,则返回true | [ -s $file ] 返回true |
-e | 检测文件(包括目录)是否存在,如果存在,则返回true | [ -e $file ] 返回true |
-a | 检测文件(包括目录)是否存在,如果存在,则返回true | [ -e $file ] 返回true |