百日筑基篇——流程控制语句(Linux入门四)

百日筑基篇——流程控制语句(Linux入门四)


前言

语句的学习在任何编程语言中都是重要的,而本章将着重介绍在Linux系统的shell脚本中的流程控制语句,希望我的笔记能帮助加深大家对语句的理解。

一、流程控制语句介绍

在Linux中,流程控制语句用于根据条件或循环来决定代码的执行流程。 包括:
if 语句
嵌套if语句
for循环
while循环
until循环
case语句
跳转语句

二、常见语句

1. if 语句

fi是用于结束if条件语句块的标记。在Shell脚本中,每个if语句必须以fi结尾,以表示条件语句块的结束。

if [ 满足条件1 ];then
    执行代码1
elif [ 满足条件2 ];then
    执行代码2
else
    执行最后代码
fi      

#代码示例:
#!/usr/bin/bash
read -p "请输入用户名:"  User
​
if grep $User /etc/passwd &> /dev/null;then
    echo "用户$User存在"
    
elif ls -d /home/$User &> /dev/null;then
    echo "用户$User不存在"
    echo "但是$User宿主目录存在"
    
else 
    echo "用户$User不存在"
    echo "$User宿主目录也不存在"
fi 

补充: >:用于将标准输出重定向到文件中。

2>:用于将标准错误输出重定向到文件中。

&>:用于将标准输出和标准错误输出同时重定向到同一个位置(文件或设备)中。

/dev/null 是一个用于处理和丢弃输出的特殊设备文件

2. 嵌套if语句

if [ 条件1 ]
then
    # 执行条件1为真时的代码
    
    if [ 条件2 ]
    then
        # 执行条件2为真时的代码
    fi
else
    # 执行条件1为假时的代码
fi

3. case语句

用来实现程序流程的选择、循环等进行控制,类似于if,但更具准确性,一般用于服务的启动、停止脚本。

#语法形式:
case 变量 in
    模式1)
    执行模式1匹配时的代码
    ;;
    模式2)
    执行模式2匹配时的代码
    ;;
    *)
    如果没有模式匹配时执行的代码
    ;;
esac

;;用于分隔每个模式匹配的代码块。
*)表示默认情况,如果没有模式匹配,则执行对应的代码块。
-----------------------------------------------------

#示例:
#简单的rsync服务管理脚本:

#!/usr/bin/bash
source /etc/init.d/functions

case $1 in
	start)
	if [ ! -f /var/run/rsync.pid ];then
		touch /var/run/rsync.pid
		rsync --daemon
		action "rsync starting.." /bin/true
	else
		action "rsync service running..." /bin/false
	fi
	;;

	stop)
	rm -f /var/run/rsync.pid
	pkill rsync
	action "rsync stopping..."/bin/true
	;;

	status)
	if [ ! -f /var/run/rsync.pid ];then
		echo "rsync service status InActive.."
	else
		rsync_status=$(ps aux |grep -v grep |awk '{print $2}')
		echo "rsync service status Active("$rsync_status")"
	fi
	;;

	*)
		echo "USAGE:$0{start|stop|status}"
		exit

esac

/etc/init.d/functions 是一个通用的初始化脚本函数库文件,用于在启动脚本中引入一些通用的函数和变量。如action函数

4. for循环

#语法形式:
for 变量名 in [取值列表]
do
    循环命令语句
done

#简单示例:
#!/bin/bash
a=0
b=10
for i in {1..9}
do
        let a++
        let b--
        echo "num is $a $b"
done

5. while循环

#语法格式:
while 条件为真
do
    命令
done
#当条件不成立时才退出循环
--------------------------------

#!/bin/bash
a=1
b=10
while [ $a -le 10 ]
do
        sum=$(( $a + $b ))
        echo $a + $b =$sum
        let a++
        let b--
done
[root@Linux wht wht_1]# source exit.sh
1 + 10 =11
2 + 9 =11
3 + 8 =11
4 + 7 =11
5 + 6 =11
6 + 5 =11
7 + 4 =11
8 + 3 =11
9 + 2 =11
10 + 1 =11




6. until循环

它会在给定条件为假时执行循环体内的代码块。与 while 循环不同,until 循环会反复执行,直到条件变为真为止。

#语法格式:
until 条件
do
    # 循环体代码块
done
#直到条件为真才退出循环
------------------------------------

#简单示例:
#!/usr/bin/bash
count=0
until [ $count -ge 5 ]
do
    echo "Count: $count"
    ((count++))
done

[root@Linux wht wht_1]# source exit.sh
Count: 0
Count: 1
Count: 2
Count: 3
Count: 4


7. 跳转语句

#简单示例:
exit 退出脚本,剩下的命令不执行。
break 跳出循环,但会执行循环后面的命令。
continue 结束本次循环,但继续下次循环,包括循环后面的命令。
return 用于从函数中返回,并将控制权交还给调用该函数的位置。
------------------------------------
# cat exit.sh 
#!/usr/bin/bash
for i in {1..6}
do
        echo "你好,我是星石"
        exit
        echo "无"
done
echo "无"

[root@Linux wht wht_1]# chmod +x exit.sh 
[root@Linux wht wht_1]# ./exit.sh 
你好,我是星石
------------------------------------

#!/usr/bin/bash
for i in {1..3}
do
        echo "你好,我是星石"
        break
        echo "无"
done
echo "有"

[root@Linux wht wht_1]# ./exit.sh 
你好,我是星石
有
-------------------------------------

#!/usr/bin/bash

for i in {1..3}
do
        echo "你好,我是星石"
        continue
        echo "无"
done
echo "有"

[root@Linux wht wht_1]# ./exit.sh 
你好,我是星石
你好,我是星石
你好,我是星石
有
--------------------------------------

#!/usr/bin/bash
# 定义一个函数
calculate_sum() {
    # 在函数内部计算两个数字的和
    local sum=$(( $1 + $2 ))

    if (( sum > 10 )); then
        return 1  # 如果和大于10,则返回退出状态码1
    else
        return 0  # 如果和小于等于10,则返回退出状态码0
    fi
}

# 调用函数并获取返回的退出状态码
calculate_sum 5 6
exit_status=$?

if (( exit_status == 0 )); then
    echo "Sum is less than or equal to 10."
else
    echo "Sum is greater than 10."
fi

#local 关键字用于在 Bash 函数中声明局部变量,以确保变量的作用范围仅限于当前函数内部

三、代码实例解析

# 一,简单的系统监控脚本
#!/usr/bin/bash
cat <<EOF
+++++++++++++++
h 显示命令帮助+
f 显示分区使用+
d 显示磁盘挂载+
m 查看内存使用+
u 查看cpu负载 +
q 退出	      +
+++++++++++++++
EOF
 
read -p "请输入你的选项:" SZ
 
case $SZ in 
	f)
		df -hT
		;;
	d)
		mount | more
		;;
	m)
		free -h
		;;
	u)
		uptime
		;;
	q)
		exit
		;;
	*)
		echo "USAGE: $0 [h|f|d|m|u|q]"
esac

----------------------------------------------------
#二,实现简单的jumpserver跳板机#Menu() 自定义函数:显示菜单选项,其中列出了四个主机及其对应的 IP 地址,以及帮助选项
#!/usr/bin/bash

Menu(){
cat <<EOF
1.node1-192.168.8.10
2.node2-192.168.8.11
3.node3-192.168.8.12
4.node4-192.168.8.13
h.help
EOF
}
​
Menu
​
read -p "请输入你要连接的主机序号:" CONN
case $CONN in
    1)
    ssh root@192.168.8.10
    ;;
    2)
    ssh root@192.168.8.11
    ;;
    3)
    ssh root@192.168.8.12
    ;;
    4)  
    ssh root@192.168.8.13
    ;;
    h)
    clear
    Menu
    ;;
    *)
    echo "USAGE: $0 输入要连接的主机序号 [1|2|3|4]"
esac    
-------------------------------------------------
#检查查主机(以8.0网段为例),并检查主机22端口是否开启。
#wait是一个用于等待子进程结束的命令。在脚本中,它被用于等待所有ping命令的子进程执行完成后再继续执行后续的代码。
#!/usr/bin/bash
for i in {100..102}
do
        Ip=192.168.8.$i
        ping -c 1 -w 1 $Ip &> /dev/null
        if [ $? -eq 0 ];then
                echo "$Ip is ok"
                echo "$Ip" >> /tmp/ip.log   #会将变量 $Ip 的值追加到 /tmp/ip.log 文件中
        else
                echo "$Ip is down"
        fi
done
        wait
        echo "scan host ip is done"
        echo "scan ssh port is starting"
 
for i in $(cat /tmp/ip.log)
do
        nmap $i |grep "22" &> /dev/null
 
        if [ $? -eq 0 ];then
                echo "$i 22端口已开启"
                echo "$i 22端口已开启" >> /tmp/port.log
        fi
done
----------------------------------------------------

#随机猜数字
#!/usr/bin/bash
num=$(echo $(( RANDOM % 100 )))  
#$(( RANDOM % 100 )):内置变量RANDOM会返回一个0到32767之间的随机整数。通过对其求模运算,得到一个范围在0到99之间的随机数。i=0
while true
do
        read -p "请输入一个随机数字[1-100]:" sz
        if [[ ! $sz =~ ^[0-9]+$ ]];then
                echo "请输入有效的整数"
                continue
        fiif [ $sz -gt $num ];then
                echo "你的数字过大"
        elif [ $sz -lt $num ];then
                echo "你的数字过小"
        else
                echo "恭喜,你猜对了!!!"
                break
        fi
        let i++
done
        echo "你总共猜了 $(( $i + 1 )) 次。"


代码原文链接:https://blog.csdn.net/qq_61116007/article/details/131164038


总结

今天介绍了在bash脚本语言的语句,通过语句可以实现更多的复杂的命令,主要学习了if语句和循环语句以及一些跳转语句。通过不断的练习去掌握他们。(其实,不同编程语言的语句思想是一致的)。
会当凌绝顶,一览众山小。

-2023-7-11 筑基篇

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星石传说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值