面向过程
顺序执行
选择执行:if;case
循环执行:for;while;until 循环需有退出条件
选择执行(选择执行的前提,就是条件测试)
条件测试方式(测试条件)
bash命令测试
bash命令有命令执行状态返回值
$?:用于上一条执行的命令状态返回值
0:成功执行
1-255:失败
可以使用exit命令,在脚本中自定义脚本状态返回值,如果不定义,脚本的状态返回值取决于脚本执行结束前的最后一条语句的状态
例子:
if [ $1 -lt $2 ] then echo "aa" get=0 else echo "bb" get=9 fi exit $get [[email protected] test]# ./1.sh 3 5 aa [[email protected] test]# echo $? 0 [[email protected] test]# ./1.sh 3 5 aa [[email protected] test]# echo $? 0
------------------------------------------------------
可单独执行的命令,可不需要如下条件测试
[ expression ]
[[ expression ]]
test expression
-----------------------------
脚本中要想完成条件判断,根据判断执行哪些语句,使用if判断
if 判断
单分支if判断
if 条件
then(条件满足)
语句
fi
多分支if判断
if 条件
then(条件满足)
语句
else(条件不满足)
语句
fi
练习:判断user1,user2是否存在,存在输出id和shell,不存在创建并输出其id
#!/bin/bash file=/etc/passwd for i in user1 user2 do id $i &> /dev/null if [ $? = 0 ] then grep "^$i" $file | awk -F: ‘{print $3,$7}‘ else useradd $i grep "^$i" $file | awk -F: ‘{print $3}‘ fi done
嵌套:if判断中可以嵌套需要的其他判断如:for循环 if判断;for循环也可嵌套if判断
for i in 列表
do
if [ ]
then
语句
else
语句
fi
done
if [ $? - eq 0 ]
then
for i in 列表
do
语句
done
else
for i in 列表
do
语句
done
fi
----------------------------------------
脚本实现条件测试的时候,有三类测试:整数测试;字符测试;文件测试
整数测试
expression:数值1 比较符 数值2
$A 比较符 $B
大于 -gt: $A -gt $B
大于或等于:-ge
等于:-eq
小于:-lt
小于或等于:-le
不等于:-ne
例子:随意两个整数,比较大小,输出大的数值
#!/bin/bash a=$RANDOM b=$RANDOM if [ $a -ge $b ] then echo -e "Max Number is A\nNumber:$a" else echo -e "Max Number is B\nNumber:$b" fi
例子:判断某个的ID是系统用户还是普通用户
#!/bin/bash UserName=user1 if [ $(id -u $UserName) -gt 499 ] then echo "Common User:$UserName" else echo "Admin User or System User:$UserName" fi 例子:判断user1;user2 UID和GID是否相同 #!/bin/bash for i in user1 user2 do if [ $(id -u $i) -eq $(id -g $i) ] then echo "$i good guy" else echo "$i bad guy" fi done
字符测试(比较两个字符串在ASCII表中的次序,从左到右逐字符比较,) 字符串需要加""
>:大于
<:小于
==:等于
=~:判断左边的字符串是否能被右边的模式匹配;通常用于[[]]之中
shell=/bin/bash
[[$shell =~ sh$ ]]
echo $? = 0
一般做行首行尾锚定,模式不能加引号
例子:查看CPU是什么品牌,最后输出品牌
#!/bin/bash cpu=$(cat /proc/cpuinfo | grep "vendor" | cut -d: -f2) if [[ $cpu =~ Intel$ ]];then echo "cpu is Inter" else echo "cpu is AMD"
fi
例子:传递一个参数给脚本,字符为memory或Memory,显示内存信息,否则显示/proc/uptime内容
#!/bin/bash if [[ $1 =~ [Mm]emory$ ]];then free -m else cat /proc/uptime fi
------------------------------------------
单目比较
-z $变量:字符串为空则为真,不空则为假
-n $变量:为空则为假,不空则为真
例子:判断一个用户的Shell是否为bash,Shell为空直接退出‘
#!/bin/bash Shell=$(grep "^$1:" /etc/passwd | awk -F: ‘{print $7}‘) if [ -z $Shell ] then echo "The user does not exist" exit 10 fi if [ "$Shell" == "/bin/bash" ] then echo "$1 Shell is BashShell" Set=0 else echo "$1 Shell Not BashShell" Set=9 fi exit $Set
文件测试
测试符:文件路径
-f :测试其是否为普通文件,即ls 文件类型为-的文件
-d:测试其是否为目录文件
-e:测试文件是否存在;存在为真,否则为假
-r:测试使用者是否可读该文件
-w:测试使用者是否可写该文件
-x:测试使用者是否可执行该文件
-s:测试该文件大小是否不空:不空则真,空则假
例子:如/tmp/test目录不存在,就创建
if [ ! -d /tmp/test ];then
mkdir /tmp/test
fi
短路操作(与优先级高于或) 前半段可以决定最终结果,后半段就不允许
与运算
真 && 真 = 真
真 && 假 = 假
假 && {真,假} = 假
或运算
假 || 真 = 真
真 || 假 = 假
[-e /tmp/test ] || mkdir /tmp/test
如果前面为真,就不创建
如果前面为假,就创建
! id test &> /dev/null && useradd test || echo "用户以存在"
第一段用户不存在为真,创建用户
第一段段用户存在为假,后面的与就不会执行,然后前面结果为假,执行或运算
----------------------------------------------------------------
bash 位置变量:把脚本后面的第一个值当作第一参数,赋予$1,依此类推
$1,$2,$3,.....
例子:判断用户是否存在
#!/bin/bash UserName=$1 if id $UserName &> /dev/null then echo "$UserName Exists" else echo "$userName Not Exists" fi [[email protected] test]# ./ifuser.sh user1 user1 Exists
$*,[email protected]:所有的位置参数
$#:位置参数的个数
shift:实现位置参数轮替
练习:通过参数传递给脚本一系列用户名,存在的跳过;不存在的添加
添加完成统计一共添加多少用户
#!/bin/bash sum=0 for username in [email protected] do if id $username &> /dev/null then echo "User $username Exists" else useradd $username &> /dev/null echo "$username" | passwd --stdin $username &> /dev/null echo -e "User $uesrname Add ok\nPasswd:$username\n" sum=$[$sum+1] fi done echo "Add $sum new users"
------------------------------------------------------------------
组合条件测试:
-a:与
-o:或
!:非 单目操作符,放在条件前面
a=3
[ ! $a -eq 0 ]
例子:判断某个用户的UID是否大于1,小于等于499,需同时满足两个条件
#!/bin/bash
uid=$(grep "^bb.*bash$" /etc/passwd | cut -d: -f3)
if [ $uid -gt 500 -a $uid -le 600 ];then
echo "user is system users"
fi
命令组合测试,仅用于命令测试
&&:与
||:或
!:非
例子:如果给定用户,如果其不存在就退出脚本
if ! id $1 &> /dev/null;then
exit 6
fi
----------------------------------------
bash 条件判断之多分支if语句
语法格式
if 条件1;then
语句
elif 条件2;then
语句
fi
列子:通过参数传递给脚本字符,如fedora,centos,就显示RedHat
如suse,opensuse就显示SuSe,如ubuntu,mint,debian就显示Debian
否则显示其他
#!/bin/bash if [ $1 = fedora -o $1 = centos ];then echo "RedHat" elif [ $1 = suse -o $1 = opensuse ];then echo "SuSe" elif [ $1 = ubuntu -o $1 = mint -o $1 = debian ];then echo "Debian" else echo "Unknown" fi
Shell脚本---条件判断