算术运算符
设置变量a=10,b=4
+ 加法
[root@localhost ~]# echo $[$a+$b] 14
- 减法
[root@localhost ~]# echo $[$a-$b] 6
* 乘法
[root@localhost ~]# echo $[$a*$b] 40
/ 除法,因为是整除,所以只等于2
[root@localhost ~]# echo $[$a/$b] 2
% 取余
[root@localhost ~]# echo $[$a%$b] 2
在脚本中可以使用expr调用
[root@localhost ~]# echo `expr $a + $b` 14 [root@localhost ~]# echo `expr $a - $b` 6 [root@localhost ~]# echo `expr $a * $b` 40 [root@localhost ~]# echo `expr $a / $b` 2 [root@localhost ~]# echo `expr $a % $b` 2
赋值运算符
= 赋值,用于变量赋值
[root@localhost ~]# a=5 [root@localhost ~]# b=$a [root@localhost ~]# echo $b 5
+= 变量经过加法运算后赋值
[root@localhost ~]# x=0 [root@localhost ~]# ((x+=5)) [root@localhost ~]# echo $x 5
*= 变量经过乘法法运算后赋值
[root@localhost ~]# x=5 [root@localhost ~]# ((x*=5)) [root@localhost ~]# echo $x 25
/= 变量经过除法法运算后赋值
[root@localhost ~]# x=5 [root@localhost ~]# ((x/=2)) [root@localhost ~]# echo $x 2
%= 变量经过取余运算后赋值
[root@localhost ~]# x=5 [root@localhost ~]# ((x%=2)) [root@localhost ~]# echo $x 1
字符串关系运算符
== 对比两个字符串是否相等,相等为真
[root@localhost ~]# a=abc [root@localhost ~]# b=abc [root@localhost ~]# [[ $a == $b ]] [root@localhost ~]# echo $? # $?返回上一条命令执行状态,0为成立,即为真 0
!= 对比两个字符串是否不想等,不想等为真
[root@localhost ~]# a=abc [root@localhost ~]# b=abb [root@localhost ~]# [[ $a == $b ]] [root@localhost ~]# echo $? 1 [root@localhost ~]# [[ $a != $b ]] [root@localhost ~]# echo $? 0
整数关系运算符
格式:[ 整数 运算符 整数 ]
-eq 等于
[root@localhost ~]# [ 5 -eq 5 ] [root@localhost ~]# echo $? 0
-gt 大于
[root@localhost ~]# [ 8 -gt 5 ] [root@localhost ~]# echo $? 0
-lt 小于
[root@localhost ~]# [ 3 -lt 5 ] [root@localhost ~]# echo $? 0
-ge 大于等于
[root@localhost ~]# [ 5 -ge 5 ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ 5 -ge 3 ] [root@localhost ~]# echo $? 0
-le 小于等于
[root@localhost ~]# [ 3 -le 3 ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ 3 -le 5 ] [root@localhost ~]# echo $? 0
-ne 不等于
[root@localhost ~]# [ 3 -ne 5 ] [root@localhost ~]# echo $? 0
文件的比较运算
-nt (newer than)判断file1是否比file2新
[root@localhost ~]# [ abc.txt -nt aaa.txt ] [root@localhost ~]# echo $? 1
-ot (older than)判断file是否比file2旧
[root@localhost ~]# [ abc.txt -ot aaa.txt ] [root@localhost ~]# echo $? 0
-ef 判断file1与file2是否为同一个文件,可用在判断hard link上
[root@localhost ~]# [ abc.txt -ef aaa.txt ] [root@localhost ~]# echo $? 1
逻辑运算符
-a 或 && :逻辑与,“而且”的意思,前后两个表达式都成立时整个测试结果才为真,否则为假
[root@localhost ~]# a=3 [root@localhost ~]# b=6 [root@localhost ~]# [ $a -ne 6 ] && [ $b -gt 9 ] [root@localhost ~]# echo $? #因为a不等于6,b不大于9,所以左边成立,右边不成立,故总体是不成立的 1 [root@localhost ~]# [ $a -ne 6 ] && [ $b -gt 4 ] [root@localhost ~]# echo $? #因为a不等于6,b大于4,左右都是成立的,故总体成立 0
[root@localhost ~]# [ $a -ne 6 -a $b -gt 4 ]
[root@localhost ~]# echo $?
0
-o 或 || : 逻辑或,“或者”的意思,操作符两边至少一个为真时,结果为真,否为为假
[root@localhost ~]# a=3 [root@localhost ~]# b=6 [root@localhost ~]# [ $a -ne 6 ] || [ $b -gt 9 ] [root@localhost ~]# echo $? #因为左边a不等于6成立,故整体成立 0 [root@localhost ~]# [ $a -ne 3 ] || [ $b -gt 4 ] [root@localhost ~]# echo $? #因为右边b大于4成立,故整体成立 0 [root@localhost ~]# [ $a -ne 3 ] || [ $b -gt 9 ] [root@localhost ~]# echo $? #因为左右两边都不成立,故整体不成立 1
! :逻辑否,当制定条件不成立时,返回结果为真
[root@localhost ~]# [ ! $a -ne 3 ] || [ $b -gt 9 ] [root@localhost ~]# echo $? #因为左边a等于3,经过-ne判断为假,又经过!否定了假,所以为真成立 0
test测试操作
test可以用[]代替,如test -e abc.txt可以写成 [ -e abc.txt ]
文件类型判断
-e 该文件名是否存在
-f 该文件名是否存在且为file
-d 该文件名是否存在且为目录
-b 该文件名是否存在且为一个block
-c 该文件名是否存在且为一个character device设备
-S 该文件名是否存在且为一个socket文件
-p 该文件名是否存在且为一个FIFO(pipe)文件
-L 该文件名是否存在且为一个连接文件
示例:
[root@localhost ~]# touch abc.txt [root@localhost ~]# test -e abc.txt [root@localhost ~]# echo $? 0 [root@localhost ~]# test -e asdfg.txt [root@localhost ~]# echo $? 1 [root@localhost ~]# test -f abc.txt [root@localhost ~]# echo $? 0
文件权限检测
-r 检测文件名是否存在且具有“可读”权限
-w 检测文件名是否存在且具有“可写”权限
-x 检测文件名是否存在且具有“可执行”权限
-u 检测文件名是否存在且具有“SUID”权限
-g 检测文件名是否存在且具有“SGID”权限
-k 检测文件名是否存在且具有“Sticky bit”权限
-s 检测文件名是否存在且为“非空白文件”
示例:
[root@localhost ~]# test -r abc.txt [root@localhost ~]# echo $? 0 [root@localhost ~]# test -x abc.txt [root@localhost ~]# echo $? 1
字符串数据判断
-z 判断字符串是否为0,若为空返回true(0)
[root@localhost ~]# test -z "abc" [root@localhost ~]# echo $? 1
-n 判断字符串是否为0,若为空返回false(0)
[root@localhost ~]# test -n "abc" [root@localhost ~]# echo $? 0
流程控制
if单分支:当“条件成立”时执行相应的操作。
if 条件测试操作 then 命令序列 fi
示例:当100大于80时,输出True
if [ 100 -gt 80 ]; then echo "True" fi
if双分枝:当“条件成立”、“条件不成立”时执行不同操作。
if 条件测试命令 then 命令序列1 else 命令序列2 fi
示例:当检查到存在abc.txt,输出True,否则输出False
#!/bin/bash if [ -e abc.txt ]; then echo "True" else echo "False" fi
if多分枝:相当于if语句嵌套,针对多个条件执行不同操作。
if 条件测试命令1; then 命令序列1 elif 条件测试命令2;then 命令序列2 elif ... else 命令序列n fi
for循环:根据标量的不同取值,重复执行一组命令操作。
for 变量名 in 取值列表 do 命令序列 done
示例1:依次打印数字1到5
#!/bin/bash for x in [1..5] do echo number $x done
while条件循环:重复测试指令的条件,只要条件为真则反复执行对应的命令操作,直到条件为假。如果使用true
作为循环条件能够产生无限循环。
while 命令表达式 do 命令列表 done
示例:批量添加20个系统账户用户名依次为user1~20
#!/bin/bash i=1 while [ $i -le 20 ] do useradd user$1 echo "123456" | passwd --stdin user$i &> /dev/null i=`expr $i + 1` done