上篇我们学会了如何使用及定义变量。按照尿性,一般接下来就该学基本数据类型的运算了。
没错,本篇就仍是这么俗套的来讲讲这无聊但又必学的基本数据类型的运算了。
基本数据类型运算
操作符
符号 | 语义 | 描述 |
---|---|---|
+ | 加 | 10+10,结果为20 |
- | 减 | 10-3, 结果为7 |
* | 乘 | 10*2,结果为20 |
/ | 除 | 10/3, 结果为3(取整数) |
% | 求余 | 10%3, 结果为1 (取余数) |
== | 判断是否相等 | 两数相等返回1,否则0 |
!= | 判断是否不等 | 两数不等返回1,否则0 |
> | 大于 | 前者大于后者返回1,否则0 |
>= | 大于或等于 | 前者大于或等于后者返回1,否则0 |
< | 小于 | 前者小于后者返回1,否则0 |
<= | 小于或等于 | 前者小于或等于后者返回1,否则0 |
上述操作符与其它语言相比,并无特殊之处。
注意:
条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]
在shell中,对于基本数据类型的运算主要分为两种,整数运算和浮点数(小数)运算。下面就分别来看看这两种运算:
整数运算
在shell中,有两种方式能实现整数运算,一种是使用expr命令, 另外一种是通过方括号($[])来实现。下面分别来看看:
expr
#!/bin/bash #输出13 expr 10 + 3 #输出10+3 expr 10+3 #输出7 expr 10 - 3 #输出30 expr 10 * 3 #输出3 expr 10 / 3 #输出1 expr 10 % 3 #将计算结果赋值给变量 num1=$(expr 10 % 3) #将计算结果赋值给变量 num2=`expr 10 % 3`
补充:(大于小于比较加转义,否则会将<做为重定向符号)
注意:
在以上的乘法(*)中,我们用了反斜线()来转义,不然会报错。
运算符前后必须还有空格,否则会被直接当作字符串返回。
如果要将计算结果保存到变量,就需要用到我们上篇文章讲到的那两种方式($() 或者 ``)来替换命令了。
这种种迹象无不让人吐槽啊。幸好还有一种实现方式,那就是接下来要看的方括号。
方括号($[])
#!/bin/bash num1=10 num2=3 #输出num1 + num2=13 echo "num1 + num2=$[$num1 + $num2]" #输出num1+num2=13 echo "num1+num2=$[$num1+$num2]" #输出num1 - num2=7 echo "num1 - num2=$[$num1 - $num2]" #输出num1 * num2=30 echo "num1 * num2=$[$num1 * $num2]" #输出num1 > num2=1 echo "num1 > num2=$[$num1 > $num2]" #输出num1 < num2=0 echo "num1 < num2=$[$num1 < $num2]" #将运算结果赋值给变量,输出num3=3 num3=$[$num1 / $num2] echo "num3=$num3"
看了这种运算,再回看expr, 是不是觉得要升天,终于正常了。expr的那几个注意事项,在这儿都不算事儿。所以,如果要图简单,还是用这种方式吧。
浮点运算
在shell中,做浮点运算一般是用bash的计算器(bc)。在shell脚本中,一般我们的使用方法是:
variable=$(echo "options; expression" | bc)
options是bc的一些选项,例如: 可以通过scale去设置保留的小数位数。具体有哪些参数,可以man bc进行查看
expression就是我们具体的表达式,例如 10 * 3
" | " 这个符号,对于熟悉linux系统的人来说,这个再熟悉不过了。它叫做管道, 之所以会叫做管道,其实很形象,你可以把它看作一根水管,水管一头接入前一个命令的返回结果, 一头接入下一个命令。表示将前一个命令的执行结果作为后一个命令的参数输入。以上,表示将我们的表达式作为bc的参数输入。
#!/bin/bash
#表示 10/3, 保留2位小数,将结果赋值给了num, 输出3.33
num=$(echo "scale=2; 10 / 3" | bc)
echo $num
布尔运算符(一个运算符)
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
逻辑运算符(两个尖括号)
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字符串运算符(一个尖括号)
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -n $a ] 返回 true。 |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
文件测试运算符(一个尖括号)
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
(1)EQ 就是 EQUAL等于
NE 就是 NOT EQUAL不等于
GT 就是 GREATER THAN大于
LT 就是 LESS THAN小于
GE 就是 GREATER THAN OR EQUAL 大于等于
LE 就是 LESS THAN OR EQUAL 小于等于
(2)使用 [[ ... ]] 条件判断结构,而不是 [ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、< 和 > 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。
也就是逻辑运算符用两个尖括号,其他普通的比较用一个括号就可以
小结
本篇比较无聊,简单介绍了shell的基本运算符及其运算。shell运算主要分为整型和浮点型的运算。整型又有两种实现方式,浮点型是通过使用bash内置的计算器(bc)来实现的。
好啦,到此,我们学习了shell的变量的使用,也学习了基本数据类型变量的计算啦!挺简单吧
接下来可以学习shell编程三:http://www.cnblogs.com/qlqwjy/p/7745983.html