一、shell条件测试 man bash //查看帮助
条件测试的命令
test 选项 文件名或目录名
或
[ 选项 文件名或目录名 ]
例:
[ -e /etc/passd ]
文件状态
-f //判断是不是文件,是文件为真
-d //判断是不是目录,是目录为真
-e //判断是不是存在,存在为真
-r //判断是否可以阅读,可以阅读为真
-w //判断是否可写,可写为真
-x //判断是否可执行,可执行为真
-l //判断是否为链接,是链接为真
数值比较(整数比较)
[ 数值1 选项 数值2 ]
或
test 数值1 选项 数值2
等于 -eq
不等于 -ne
小于 -lt
小于等于 -le
大于 -gt
大于等于 -ge
h
[ 字符选项比较 ]
等于 ==
不等于 !=
-z 字串为空为真
! -z 字串不为空为真
例:
[ $USER==root ] && echo "admin"
[ -z $w ]
逻辑比较(判断时,是2个或2个以上条件时使用逻辑判断)
逻辑与 && 或用 -a 多个条件要同时成立
逻辑或 || 或用 -o 或用多个条件只要有一个条件成立就可以
逻辑非 ! 取号 -z为空 !-z 加了叹号也就是取反不为空
[ 5 -gt 6 ] || [ 7 lt 8 ] || [ 0 -lt 1 ]
或
[ 5 -gt 6 -o 7 -lt 8 -o 0 -lt 1 ]
流程控制 是否执行 取决于条件判断的判断结果是否为真。条件判断结果为真,
流程控制才会执行,反之不会执行。对不同的对象做判断,要用不同的判断方式和选项
二、Shell运算符与运算命令
+ - * / %
++ --
+= -= *= /= %=
运算命令
expr 数值1 运算符 数值2
例1:
#!/bin/bash
#计算用户从终端输入的任意2个数的和
read -p "请输入第一个数" num1
read -p "请输入第二个数" num2
sum=`expr $num1 + $num2`
echo "$num1 + $num2 = $sum"
例2
expr 只能做整数运算 默认返回计算结果
#expr num1 + num2 - num3 \* num4 //乘号要做转义
#expr 10 % 8
#a=10
#b=20
#sum=`expr $a + $b`
++ 自加运算 每次数字自动加1
-- 自减运算 每次数字自动减1
let 只做运算,不返回计算结果
let 变量运算符
i=1
let i++ //i=i+1
echo $i
j=10
let j-- //j=j-1
echo $j
+= -= *- /= %=
i=10
let i+=2 //i=i+2
echo $i
加法算的第二种运算方式 $(()) $[] 的使用
#echo $((10*30))
#x=10
#b=20
#echo $((x*y))
#echo $[10*30]
i=10
echo $((++i)) //先执行运算,后参与程序
i=10
echo $((i++)) //先参与程序,后执行运算
Shell里的流程控制
选择结构 if (只有条件判断结果为真时,才执行相应的操作)
单分支
if 条件
条件判断成立时,要执行的操作
.......
fi
例:
read -p "please input ip address" addr
if [ -z $addr ];then
echo "你没有输入要ping的ip地址"
exit
fi
ping -c 3 $addr &> /dev/null
if [ $? -eq 0 ];then
echo "主机在线"
fi
echo "script over"
双分支
if 条件测试命令;then
条件判断成立时,要执行的操作
.........
else
条件判断不成立时,要执行的操作
.........
fi
#!bin/bash
service sshd status &> /dev/null
if [ $? -eq 0 ];then
echo "sshd in running"
else
service sshd start
fi
多分支
if 条件测试命令1;then
条件测试成立时执行的命令序列
......
......
elif 条件测试命令2;then
条件测试成立时执行的命令序列
......
......
elif 条件测试命令3;then
条件测试3成立时执行的命令序列
......
......
elif 条件测试命令N;then
条件测试N成立时执行的命令序列
......
......
else
以上所有的条件判断都成立时执行的命令
......
......
fi
循环结构(反复执行相同操作时,使用循环结构)
for语法格式
for 变量名 in 变量值列表
do
当变量值列表有值赋给变量名时,执行的语句块
......
.....
doneasswd
#!/bin/bash
#for i in 1 2 3 4 5
#for i in `seq 30 45`
#for i in `seq 254`
#for i in `seq 10 2 30`
#for i in {1..30}
#for i in {a..z}
for i in `head /etc/`
for i in `ls /shell/*.sh`
do
echo $i
done
while
C-for
until
分支结构 case (根据变量值的匹配结果执行相应的操作)