循环语句与函数

前言

循环语句相对于前面所说的if语句,使拥有更强大的功能,能够更好的帮助我们提升工作效率。

一、循环语句

1.for循环

读取不同的变量值,用来执行同一组命令
语句结构:
for 变量名 in 取值列表
do
命令序列
done

例:从0开始,需要0-20中的偶数
[root@localhost home]# vim t2.sh 
#!/bin/bash
for i in {0..20..2} 
do
   echo $i
done  
[root@localhost home]# sh t2.sh 
0
2
4
6
8
10
12
14
16
18
20
例:九九乘法表
[root@localhost ~]# vim cfb.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
[root@localhost ~]# chmod +x cfb.sh 
[root@localhost ~]# ./cfb.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循环

重复测试某个条件,只要条件成立则反复执行
语句结构:
while 条件测试操作
do
命令序列
done

例:猜价格
[root@localhost home]# vim sp.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 500)        #PRICE价格,RANDOM随机
a=0
echo "价格范围为0-500,猜猜是多少?" 
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
[root@localhost ~]# vim sp.sh
[root@localhost ~]# chmod +x sp.sh 
[root@localhost ~]# ./sp.sh 
数字范围为0-500,猜猜是多少?
请输入你猜测价格:480
你猜高了!
请输入你猜测价格:400
你猜低了!
请输入你猜测价格:450
你猜高了!
请输入你猜测价格:440
你猜高了!
请输入你猜测价格:430
你猜高了!
请输入你猜测价格:420
你猜低了!
请输入你猜测价格:425
你猜低了!
请输入你猜测价格:427
恭喜你答对了,实际价格是 427
你总共猜测了 8

3.until循环

重复测试某个条件,只要条件不成立则反复执行
语句结构:
until 条件测试操作
do
命令序列
done

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

二、Shell函数

函数的定义

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

结构:
1.常规写法
function 函数名{
命令序列
}
2.简洁写法
[function] 函数名(){
命令序列
}

调用函数的方法
函数名 [参数1] [参数2]

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

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

[root@localhost ~]# vim demo.sh
#!/bin/bash
function fun1 {
echo "this is a function"
}

fun1      #调用

[root@localhost ~]# chmod +x demo.sh
[root@localhost ~]# ./demo.sh 
this is a function

例:安装httpd服务
[root@localhost ~]# vim httpd.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
}


backuprepo
makelocalrepo
uselocalrepo

[root@localhost ~]# chmod +x httpd.sh
[root@localhost ~]# ./httpd.sh 
mkdir: 无法创建目录"repo.bak": 文件已存在
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /run/media/root/CentOS 7 x86_64 上
       /dev/sr0 已经挂载到 /mnt 上

三、Shell数组

1.应用场景

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

2.数组的定义

数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用
定义方式:
1.直接把要加入数组的元素用小括号括起来,中间用空格分开
num= (11 22 33 44)
$ { #num}显示字符串长度
数组名=(value0 value1 value2)
2.精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
num=([0]=55 [1]=66 [2]=77 [ 4]=88)

数组名=( [0]=value [1] =value [2]=value…)
3.先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
list=“11 12 13 14”
num=($list)
4.根据下标定义
数组名[0]=“11”
数组名[0]=“22”
数组名[0]=“33”

数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”

3.数组包括的数据类型

数值类型
字符类型
使用" "或’ '定义

[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

总结

for循环和while循环日常生活中用的频率较高,他们主要是当条件成立进行循环操作,而until循环与之相反,是条件不成立时进行循环操作。
自定义函数并不会自动运行,需要人工调用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值