shell-流程控制-3
创始人
2025-05-29 06:38:54

条件判断

格式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 命令序列
fiif [ condition ];thencommandcommand
fiif test 条件;then命令
fiif [[ 条件 ]];then命令
fi

双分支结构

if 条件测试
then 命令序列
else 命令序列
fiif [ 1 -eq 2 ];thenecho 不可能
elseecho 不等于
fi

 多分支结构

if 条件测试1
then 命令序列[elif 条件测试2
then 命令序列elif 条件测试3 
then 命令序列]...else 命令序列
fi

层层嵌套结构

if [ condition1 ];thencommand1		if [ condition2 ];thencommand2fielseif [ condition3 ];thencommand3elif [ condition4 ];thencommand4elsecommand5fi
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++))   初值;条件;自增 
doecho $i
donei++===先赋值再运算
++i===先运算再赋值(1)i++实例:
for  (( i=1;i <= 5;i++ ))
dolet x=i++        i:2  4   6echo $i          x: 1  3   5echo $x
done++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++(2)++i实例:
for  (( i=1;i <= 5;++i ))
dolet x=++i          i:2  4   6echo $i            x: 2  4   6 echo $x
donepython风格
for i in {1..100}
doecho $i
done另一种写法:seq的使用
for i in $(seq 1 100)       seq 1 100=1-100
doecho $i
done
案例
批量添加账户:
#!/usr/bin/env bash
#批量添加账户
for i in {30..40}douseradd user$i && echo "123" | passwd --stdin user$i &>/dev/nullif [ $? -eq 0 ];thenecho "账户 user$i 添加成功"elseecho "账户 user$i 添加失败"fidone批量删除账户:
#!/usr/bin/env bash
#批量删除账户
for i in {30..40}douserdel -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 ]
douserdel -r user$ilet i++
done案例
echo  "please enter a number between 5 and 10 :" 
read var
while [[ $var != 0  ]]
doif [ "$var" -lt 5 ] thenecho "Too smail , Try again"read varelif [ "$var" -gt 10 ]then echo "Too big , Try again"read varelseecho "Congratulation! You are right."exit 0;fi
done  

case匹配模式

case 语法结构
case $变量 inpattern1)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:闪烁

相关内容

热门资讯

今日分享.八闽福建麻将有没有挂... 今日分享.八闽福建麻将有没有挂.外卦神器下载!亲,八闽福建麻将这个游戏其实有挂的,确实是有挂的,需要...
今日重大通报“新皇豪互娱到底有... 您好:新皇豪互娱这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8700483】很多玩家在新皇豪...
监管鼓励不良资产转让 上半年消... 在监管机构鼓励不良资产转让的大背景下,今年以来,消费金融行业不良资产转让市场持续升温。截至5月29日...
重磅推荐"飞鱼到底有... 您好:飞鱼这款游戏可以开挂,确实是有挂的,需要软件加微信【5991307】,很多玩家在飞鱼这款游戏中...
玩家必看“拱趴大菠萝到底可以开... 您好:拱趴大菠萝这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4194432】很多玩家在拱趴大...