Shell编程之循环语句与函数

目录

一、循环语句

1、for循环语句

(1)for语句

(2)语句的结构

(3)语句的结构图

2、while循环语句

(1)while语句

(2)语句的结构

(3)语句的结构图

3、until循环语句

(1)until语句

(2)语句的结构

(3)语句的结构图

 二、Shell函数

1、函数的定义

2、ShelI脚本调试

三、Shell数组

1、应用场景 

2、数组的定义

3、数组的分类

4、数组的定义方式

总结


在使用循环语句和函数,且具有很强大的功能,可以轻松的完成更加复杂的工作,也很好的提高了工作效率,使用运维人员更加轻松的解决一系列的复杂问题,提高工作效率。

一、循环语句

1、for循环语句

(1)for语句

读取不同的变量值,用来逐个执行同一组命令

(2)语句的结构

for语句的操作对象为用户指定名称的变量,并通过 in 关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于do…done之间的命令序列称为循环体,其中的执行语句需要引用变量以完成相应的任务。

for 变量名 in 取值列表
do
	命令序列
done

(3)语句的结构图

for语句的执行流程:首先将列表中的第一个取值赋给变量,并执行do…done循环体中的命令序列;然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列……依此类推,直到列表中的所有取值用完,最后将跳至done语句,表示结束循环。

检查ping通ip地址段

[root@localhost ~]# vim ip.sh

#!/bin/bash
for ((i=1;i<=255;i++))
do
        echo "192.168.32.${i}" >> /opt/ipadds.txt
done

HLIST=$(cat /opt/ipadds.txt)

for IP in $HLIST
do
        ping -c 1 -i 0.2 -w 1 $IP &> /dev/null
                if [ $? -eq 0 ];then
                        echo "Host $IP is up"
                else
                        echo "Host $IP is down"
                fi
done
:wq

[root@localhost ~]# sh ip.sh
Host 192.168.32.1 is up
Host 192.168.32.2 is up
Host 192.168.32.3 is down
Host 192.168.32.4 is down
Host 192.168.32.5 is down
Host 192.168.32.6 is down
Host 192.168.32.7 is down
Host 192.168.32.8 is down
Host 192.168.32.9 is down
Host 192.168.32.10 is down
Host 192.168.32.11 is down
Host 192.168.32.12 is down
Host 192.168.32.13 is down
Host 192.168.32.14 is down
Host 192.168.32.15 is down
Host 192.168.32.16 is down
Host 192.168.32.17 is down
Host 192.168.32.18 is down
Host 192.168.32.19 is down
Host 192.168.32.20 is down
九九乘法表
[root@localhost ~]# vim jj1.sh 

#!/bin/bash
for ((i=1;i<=9;i++))
do
        for ((j=1;j<=i;j++))
        do
                echo -n "$i*$j=$((i*j)) "
        done
        echo ""
done
:wq

[root@localhost ~]# sh jj1.sh 
1*1=1 
2*1=2 2*2=4 
3*1=3 3*2=6 3*3=9 
4*1=4 4*2=8 4*3=12 4*4=16 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

2、while循环语句

(1)while语句

重复测试某个条件,只要条件成立则反复执行

(2)语句的结构

使用while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。 因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。

while 条件测试操作
do
	命令序列
done

(3)语句的结构图

while语句的执行流程:首先判断 while后的条件测试操作结果,如果条件成立,则执行do…done 循环体中的命令序列;返回while后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体;再次返回到while后,判断条件测试结果……如此循环,直到while后的条件测试结果不再成立为止,最后跳转到done语句,表示结束循环。
 

[root@localhost ~]# vim WEBJK.sh

#!/bin/bash
DATE=`date +%Y-%m-%d-%T`
while true
do
        ps aux | grep httpd | grep -v grep &> /dev/null
        if [ $? -ne 0 ];then
                echo "httpd服务已停止运行-$DATE!" >> /home/httpd.txt
                echo "httpd服务已停止运行,请尽快处理故障!"
                sleep 3
        else
                echo "httpd服务正在运行当中!"
                sleep 3
        fi
done
:wq

[root@localhost ~]# sh WEBJK.sh 
httpd服务正在运行当中!
httpd服务正在运行当中!
httpd服务正在运行当中!
httpd服务已停止运行,请尽快处理故障!
httpd服务已停止运行,请尽快处理故障!
httpd服务正在运行当中!
httpd服务正在运行当中!
httpd服务正在运行当中!
猜商品价格
[root@localhost ~]# vim JG.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
a=0
echo "商品实际价格范围为0-999,猜猜看是多少?"

while true
do
        read -p "请输入你猜测的价格数目:" n
        let a++
                if [ $n -eq $PRICE ] ; then
                        echo "恭喜你答对了,实际价格是 $PRICE"
                        echo "你总共猜测了 $a 次"
                        exit 0
                elif [ $n -gt $PRICE ]; then
                        echo "你猜高了!"
                else
                echo "你猜低了!"
                fi
done
:wq


[root@localhost ~]# sh JG.sh 
商品实际价格范围为0-999,猜猜看是多少?
请输入你猜测的价格数目:850
你猜高了!
请输入你猜测的价格数目:840
你猜高了!
请输入你猜测的价格数目:830
你猜高了!
请输入你猜测的价格数目:820
恭喜你答对了,实际价格是 820
你总共猜测了 4 次
猜商品价格
[root@localhost ~]# vim JG1.sh
#!/bin/ bash
PRICE=`expr $RANDOM % 1000`
a=0
echo "商品实际价格范围为0-999,猜猜看是多少?"

while true
do
        read -p "请输入你猜测的价格数目:" n
        let a++
                if [ $n -eq $PRICE ] ; then
                        echo "恭喜你答对了,实际价格是 $PRICE"
                        echo "你总共猜测了 $a 次"
                        break
                elif [ $n -gt $PRICE ] ; then
                        echo "你猜高了!"
                else
                        echo "你猜低了!"
                fi
done
:wq

[root@localhost ~]# sh JG1.sh 
商品实际价格范围为0-999,猜猜看是多少?
请输入你猜测的价格数目:300
你猜低了!
请输入你猜测的价格数目:350
你猜高了!
请输入你猜测的价格数目:310
你猜高了!
请输入你猜测的价格数目:305
你猜低了!
请输入你猜测的价格数目:308
恭喜你答对了,实际价格是 308
你总共猜测了 5 次

3、until循环语句

(1)until语句

重复测试某个条件,只要条件不成立则反复执行

(2)语句的结构

 until循环与while循环类似,while循环能实现的脚本until同样也可以实现,但区别是while循环在条件为真是继续执行循环,而until则是在条件为假时执行循环。

until 条件测试操作
do
	命令序列
done

(3)语句的结构图

until语句的执行流程:首先判断until后的条件测试操作结果,如果条件不成立,则执行do…done循环体中的命令序列;返回until后再次判断条件测试结果,如果条件仍然不成立,则继续执行循环体;再次返回到until后,判断条件测试结果……如此循环,直到until后的条件测试结果成立为止,最后跳转到done语句,表示结束循环。

1-50累计相加之和
[root@localhost ~]# vim JF1.sh
#!/bin/bash
i=1
sum=0
until [ $i -eq 51 ]
do
        sum=$[$i+$sum]
        let i++
done
echo "$sum"
:wq

[root@localhost ~]# sh JF1.sh 
1275

 二、Shell函数

1、函数的定义

(1)将命令序列按格式写在一起,可方便重复使用命令序列。

函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错当然我们写函数最终目的还是为了调用,为了实现某个功能块。

[function] 函数名() {
    命令序列
    [return x]
}

(2)函数返回值:return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值使用原则。
①函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
②退出状态码必须是0~255,超出时值将为除以256取余

(3)调用函数的方法

函数名 [参数1] [参数2]
安装httpd服务

[root@localhost ~]# vim HTTPD1.sh
#!/bin/bash
set -x
function backuprepo {
cd /etc/yum.repos.d
mkdir repo.bak
mv *.repo repo.bak
mount /dev/sr0 /mnt > /dev/null
}

makelocalrepo (){
echo -e '
[local]
name=local
baseurl=file:///mnt
enabled=1
gpgcheck=0' > local.repo
}

uselocalrepo (){
yum clean all > /dev/null
yum makecache > /dev/null
yum install -y httpd> /dev/null
systemctl start httpd
}

##############main##################
backuprepo
makelocalrepo
uselocalrepo
:wq

[root@localhost ~]# sh HTTPD1.sh 
+ backuprepo
+ cd /etc/yum.repos.d
+ mkdir repo.bak
+ mv CentOS-Base.repo CentOS-CR.repo CentOS-Debuginfo.repo CentOS-fasttr
ack.repo CentOS-Media.repo CentOS-Sources.repo CentOS-Vault.repo repo.bak+ mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
+ makelocalrepo
+ echo -e '
[local]
name=local
baseurl=file:///mnt
enabled=1
gpgcheck=0'
+ uselocalrepo
+ yum clean all
+ yum makecache
+ yum install -y httpd
+ systemctl start httpd

2、ShelI脚本调试

(1)echo 命令

(2)bash 命令:sh [-nvx] 脚本名

-n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
-v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
-x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。

(3)set 命令
set -x:开启调节模式;
set +x:关闭调节模式。

三、Shell数组

1、应用场景 

获取数组长度;获取元素长度;遍历元素;元素切片;元素替换;元素删除

2、数组的定义

数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用。

3、数组的分类

普通数组:不需要声明直接定义,下标索引只能是整数。

关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串。

4、数组的定义方式

第(1)种:直接把要加入数组的元素用小括号括起来,中间用空格分开。

num=(11 22 33 44)

第(2)种:精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续。

num=([0]=55 [1]=66 [2]=77 [4]=88)

第(3)种:先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组。

list="11 12 13 14"
num=($list)

第(4)种:可以把命令的结果用小括号括起来添加到数组,那么数组会以空格或者制表符区分每一个元素。

[root@localhost ~]# num=( `cat /etc/passwd` )
[root@localhost ~]# echo ${#num[*]}
92
[root@localhost ~]# echo ${num[0]}
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# an=(10 20 30 40 50)
[root@localhost ~]# an_lg=${an[*]}
[root@localhost ~]# echo $an_lg 
10 20 30 40 50
[root@localhost ~]# an_lg=${an[@]}
[root@localhost ~]# echo $an_lg 
10 20 30 40 50
[root@localhost ~]# an_lg=${#an[@]}
[root@localhost ~]# echo $an_lg 
5
[root@localhost ~]# an_lg=${an[2]}
[root@localhost ~]# echo $an_lg 
30
[root@localhost ~]# arr=(1 2 3 4 5 6)
[root@localhost ~]# for i in ${arr[*]}
> do
> echo $i
> done
1
2
3
4
5
6
[root@localhost ~]# echo ${arr[*]:3:3}
4 5 6
[root@localhost ~]# echo ${arr[*]/4/40}
1 2 3 40 5 6
[root@localhost ~]# echo ${arr[*]}
1 2 3 4 5 6
[root@localhost ~]# unset arr[5]
[root@localhost ~]# echo ${arr[*]}
1 2 3 4 5

总结

1、for语句可根据已知的列表对象重复执行命令序列,更适合无规律的循环操作。
2、while语句可根据特定的条件重复执行命令序列,更适合有规律的循环操作。
3、在 Linux系统中有很多服务启动脚本定义了丰富的Shell函数,并嵌套了各种语句。
4、Shell 脚本调试的方法有:echo命令、bash命令、set命令。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值