百日筑基篇——流程控制语句(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
fi
if [ $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 筑基篇