前言
循环语句相对于前面所说的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循环与之相反,是条件不成立时进行循环操作。
自定义函数并不会自动运行,需要人工调用。

被折叠的 条评论
为什么被折叠?



