shell-流程控制-3
条件判断
格式1:test 条件表达式
格式2:[ 条件表达式 ] 条件表达式前后都有空格
格式3:[[ 条件表达式 ]] 条件表达式前后都有空格,支持正则表达式
文件测试
格式:[ 操作符 文件 ]
文件测试常用参数
[root@localhost ~]# [[ -d /home ]] && echo $?
0
[root@localhost ~]# [ -d /home ] && echo $?
0
[root@localhost ~]# test -d /home &&echo $?
0
[root@localhost ~]# [ ! -d /ccc ] && mkdir /ccc
数值比较(整数)
示例:
[root@localhoat ~]# id -u
0
[root@localhost ~]# [ $(id -u) -eq 0 ] && echo "当前是超级用户"
当前是超级用户
[alice@localhost ~]$ [ $UID -eq 0 ] && echo "当前是超级用户" || echo "you不是超级用户"
you不是超级用户
C语言风格的数值比较(了解)
[root@localhost ~]# ((1<2));echo $?
0
[root@localhost ~]# ((1==2));echo $?
1
[root@localhost ~]# ((1>2));echo $?
1
[root@localhost ~]# ((1>=2));echo $?
1
[root@localhost ~]# ((1<=2));echo $?
0
[root@localhost ~]# ((1!=2));echo $?
0
[root@localhost ~]# ((`id -u`>0));echo $?
1
[root@localhost ~]# (($UID==0));echo $?
0
字符串比较
字符串比较时要加双引号
[root@localhost ~]# [ "$USER" = "root" ];echo $?
0
[root@localhost ~]# [ "$USER" == "root" ];echo $?
0
注意:
"":弱引用,可以实现变量和命令的替换
[root@localhost ~]# x=*
[root@localhost ~]# echo "$x"
*
'':强引用,不完成变量替换
[root@localhost ~]# x=*
[root@localhost ~]# echo '$x'
$x
扩展:判断变量字符串是否为空
-z:变量字符串为空,返回值0
-n:变量字符串不为空,返回值0
[root@localhost ~]# var1=111
[root@localhost ~]# var2=
[root@localhost ~]# //var3变量没有定义
[root@localhost ~]# echo ${#var1} #显示变量中字符串的个数
3
[root@localhost ~]# echo ${#var2}
0
[root@localhost ~]# echo ${#var3}
0
[root@localhost ~]# [ -z "$var1" ];echo $? //-z 变量字符串为空
1
[root@localhost ~]# [ -z "$var2" ];echo $?
0
[root@localhost ~]# [ -z "$var3" ];echo $?
0
[root@localhost ~]# [ -n "$var1" ];echo $? //-n 变量字符串不为空
0
[root@localhost ~]# [ -n "$var2" ];echo $?
1
[root@localhost ~]# [ -n "$var3" ];echo $?
1
条件结构
流控制
在一个shell脚本中的命令执行顺序称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。
流控制命令:能让脚本的流根据条件而改变的命令称为条件流控制命令
exit语句:退出程序的执行,并返回一个返回码,返回码为0正常退出,非0为非正常退出
if语句
if结构
单分支结构
条件判断语法:
if [判断条件]---代码返回0表示真,非0为假
if 条件测试
then 命令序列
fi
if [ condition ];then
command
command
fi
if test 条件;then
命令
fi
if [[ 条件 ]];then
命令
fi
双分支结构
if 条件测试
then 命令序列
else 命令序列
fi
if [ 1 -eq 2 ];then
echo 不可能
else
echo 不等于
fi
多分支结构
if 条件测试1
then 命令序列
[elif 条件测试2
then 命令序列
elif 条件测试3
then 命令序列]...
else 命令序列
fi
层层嵌套结构
if [ condition1 ];then
command1
if [ condition2 ];then
command2
fi
else
if [ condition3 ];then
command3
elif [ condition4 ];then
command4
else
command5
fi
fi
如果条件1满足,执行命令1;如果条件2也满足执行命令2,如果不满足就只执行命令1结束;
如果条件1不满足,不看条件2;直接看条件3,如果条件3满足执行命令3;如果不满足则看条件4,如果条件4满足执行命令4;否则执行命令
循环结构
for循环
语法结构:for i in {范围}
for i in {取值范围} #for是关键字 i是变量名 in是关键字
do #循环体的开始
循环体
done #循环体的结束
for语句需要定义一个变量和取值范围,根据不同的变量值值执行相同的命令,直到变量值用完。
两种格式
c语言风格
for ((i=1; i<=100; i++)) 初值;条件;自增
do
echo $i
done
i++===先赋值再运算
++i===先运算再赋值
(1)i++实例:
for (( i=1;i <= 5;i++ ))
do
let x=i++ i:2 4 6
echo $i x: 1 3 5
echo $x
done
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(2)++i实例:
for (( i=1;i <= 5;++i ))
do
let x=++i i:2 4 6
echo $i x: 2 4 6
echo $x
done
python风格
for i in {1..100}
do
echo $i
done
另一种写法:seq的使用
for i in $(seq 1 100) seq 1 100=1-100
do
echo $i
done
案例
批量添加账户:
#!/usr/bin/env bash
#批量添加账户
for i in {30..40}
do
useradd user$i && echo "123" | passwd --stdin user$i &>/dev/null
if [ $? -eq 0 ];then
echo "账户 user$i 添加成功"
else
echo "账户 user$i 添加失败"
fi
done
批量删除账户:
#!/usr/bin/env bash
#批量删除账户
for i in {30..40}
do
userdel -r user$i &>/dev/null
[ $? -eq 0 ] && echo "账户 user$i 删除成功" || echo "账户 user$i 删除失败"
done
while循环
不断重复的执行循环体中的语句,直到某个条件成立
while语句结构
while 条件测试
do
循环体
done
当条件测试成立(条件测试为真),执行循环体
until语法结构
until 条件测试
do
循环体
done
当条件测试成立(条件测试为假),执行循环体
案例
#!/bin/bash
i=1
until [ "$i" -eq 21 ]
do
userdel -r user$i
let i++
done
案例
echo "please enter a number between 5 and 10 :"
read var
while [[ $var != 0 ]]
do
if [ "$var" -lt 5 ]
then
echo "Too smail , Try again"
read var
elif [ "$var" -gt 10 ]
then
echo "Too big , Try again"
read var
else
echo "Congratulation! You are right."
exit 0;
fi
done
case匹配模式
case 语法结构
case $变量 in
pattern1)
list1
;; ---------------------结尾。
pattern2)
list2
;;
... ...
patternN)
listN
;;
*) --------------------> 如果前面命令没有执行成功那么执行下面这个
list*
;;
esac
命令;;表明流应该跳转到case语句的最后,类似C语言中的break指令。
第一行: 声明case关键字调用case语法, 紧跟的“变量”一般为用户的输入值, in代表从下方的各个模式进行匹配
第2-4行: 匹配到“pattern1”后进行命令的输出或执行, pattern1: 一般为字符或数值
第11-12行: 当用户输入的字符不存在匹配模式时, 直接执行或打印*)下的命令或语句
示例
#!/usr/bin/env bash
cat <<-EOF
+-------------------------------------------------------------------------+
| System_tools V1.0 |
+-------------------------------------------------------------------------+
| a. Stop And Disabled Firewalld. |
| b. Disabled SELinux Secure System. |
| c. Install Apache Service. |
| d. Quit |
+-------------------------------------------------------------------------+
EOF
echo "Please input your select: " && read var
case "$var" in
"a")
systemctl stop firewalld && systemctl disable firewalld
;;
"b")
setenforce 0
;;
"c")
yum -y install httpd httpd-tools
;;
"d")
exit
;;
*)
printf "请按照上方提供的选项输入!!!\n"
;;
esac
可以搭配while循环增强脚本可用性
循环控制语句
break:在语句块执行过程中终止循环,并且跳出整个循环
contiue:在语句块执行过程中终止当前循环,跳出该次循环,执行下一次循环。
exit:在语句块执行过程中退出脚本
格式化打印
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。使用 printf 的脚本比使用 echo 移植性好。
语法格式:printf format-string [arguments...]
• format-string: 为格式控制字符串
• arguments: 为参数列表。
$ echo "Hello, Shell"
Hello, Shell
$printf "Hello, Shell"
$ printf "Hello, Shell\n"
Hello, Shell
vim printf.sh
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234
printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
%s %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
- 左/右对齐
字符串:%s
小数:%f
数字:%d
颜色
shell脚本中echo显示内容带颜色显示,需要使用到-e参数
格式1:echo -e “\033[背景颜色;字体颜色m 要输出的字符 \033[0m”
格式2:echo -e “\e[背景颜色;字体颜色m 要输出的字符 \e[0m”
echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”
控制选项:
\033[0m:关闭所有属性
\033[1m:高亮显示,加粗
\033[5m:闪烁