shell脚本中的循环语句

108 阅读3分钟

循环的含义

将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件重复运行次数

-循环次数事先已知
-循环次数事先未知

1.for

for是用于已知循环次数的脚本命令

格式: for (变量) in (次数);do (循环的事件);done(结束)

当使用c语言格式表示的时候:for (( 表达式1; 表达式2; 表达式3 )); do 命令; done

for ((expr1;expr2;expr3))
do
       command
done

expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出

image.png

例子:

使用for写一个脚本10以内偶数相加
#!/bin/bash
sum=0
for i in `seq 0 2 10`   
#这边i为变量 ,seq 0 2 10表示0-10之间每隔2个字符的数字,所以表示偶数
do
sum=$[sum+i]
#这样就可以重复相加
done
echo "$sum"


使用for写一个脚本10以内奇数相加
#!/bin/bash
sum=0
for i in `seq 1 2 10`   
#这边i为变量 ,seq 0 2 10表示1-10之间每隔2个字符的数字,所以表示奇数
do
sum=$[sum+i]
#这样就可以重复相加
done
echo "$sum"

写一个九九乘法表
#!/bin/bash
for j in {1..9}
#设置次数1-9
do
for i in `seq $j`
do
#设置内循环也是1-9相乘
echo -e "${i}*${j}=`echo $[i*j]` \t\c"
#=前面表示变量乘变量,=后面才是真实的数值  \t表示自动排列,\c不换行的意思
done
echo
done

image.png

打印正方形
#!/bin/bash
for j in {1..9}
do
for i  in {1..9}
do
echo -e " * \c"
#\c换行
done
echo
#换行
done

image.png

批量添加用户
#!/bin/bash
usr=`cat /opt/user`
#这是要创建用户的名字的文件夹
for i in $usr
do
        useradd $i
        echo "123123" |passwd --stdin $i &>/dev/null
#批量设置密码
done
              

image.png

批量修改后缀名
先使用脚本批量创建文件名
#!/bin/bash
i=`cat /opt/name.txt`
for j in $i
do
touch $j
done

再修改文件名
#!/bin/bash
cd /opt
for i in *

do
muzi=`echo $i |awk -F'_' '{print$1}'`
#提取出名字
num=`echo $i|awk -F'_' '{print$2}'`
#提取出数字
mv $i  ${num}${muzi}
#再重新组合
done

image.png

2.while和until

相对于for,需要知道循环次数

我们只知道停止条件,不知道次数,就需要使用while

直到达到条件,注意需要退出命令,不然会进入死循环

while
当命令判断为假时停止

求和
#!/bin/bash
i=0
while [ $i -le 100  ]
#设置判定只要变量i小于等于100 ,就一直执行命令
do
sum=$[sum+i]
let i++
#每回合i都加1这样一直加到大于100,就退出循环了
done
echo $sum

image.png

until
当命令判定为真时停止


求和
#/bin/bash
i=0
sum=0
until [ $i -gt 100 ]
#当i大于100时,命令循环停止
do
let sum+=$i
let i++
done
echo $sum

猜价格游戏
#!/bin/bash
a=`echo $[RANDOM%1000+1]`
#设置一个随机数

t=0
#记录抽奖次数

while :
do
read -p "请输入商品的价格1-1000:" num
let t++
#输入一次就加一次t统计猜的次数

if [ $num -eq $a ]
#设置判断如果猜对了直接大退出去
then
echo "恭喜你才对了!"
echo "您一共猜了${t}次"
#显示自己猜了多少次
exit 0
#猜对后就直接大退出去,不然就一直循环

elif [ $num -gt $a  ]
then
echo "你猜高了"
else
echo "你猜低了"
fi
done

image.png

双重循环及跳出循环

  • break跳出单个循环后面加数字2则代表跳出两层循环(数字是n就代表跳出n层循环)
  • continue终止某次循环中的命令,但是不会完全终止命令
  • exit直接退出脚本
#本层循环
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]
then 
continue 
#当i=5是就关闭5这个循环,其他继续执行
fi
echo i=$i
done

image.png

#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]
then
exit 0 
#直接退出脚本
fi
echo i=$i
done

image.png

3.菜单

WORDS 变量被展开,生成一个词的列表。展开的词集合被打印 在标准错误输出设备上,每个以一个数字做前缀。如果没有 in WORDS' 则假定使用in "$@"'。PS3提示符会被显示并且从标准输入读入一行 如果该行由被显示的词对应的数字组成,则 NAME 变量被设定为相应 的词。如果行为空,则 WORDS 变量和提示符被重新显示。如果读取了 文件结束符,则命令完成。读入任何其他的值会导致 NAME 变量被设定 为空。读入的行被存放在变量 REPLY 中。COMMANDS 命令在每次选择 之后执行直到执行一个 break 命令。

一定要使用$REPLY

[root@localhost ~]#select menu in 配置网卡 配置yum源;do echo $menu;done
1) 配置网卡
2) 配置yum源
#? 1
配置网卡
#? 2
配置yum源
设置菜单

#!/bin/bash
sum=0
PS3="请输入(1-6):"
MENU="
宫保鸡丁
酸菜鱼
鱼香肉丝
佛跳墙
水煮肉片
点菜结束
"

select menu in $MENU
do
case $REPLY in
#这边是固定格式必须得写这个
1)
echo $menu 价格是20
let sum+=20
;;
2)
echo $menu 价格是60
let sum+=60
;;


3)
echo $menu 价格是25
let sum+=25
;;

4)
echo $menu 价格是150
let sum+=150
;;

5)
echo $menu 价格是60
let sum+=60
;;

6)
echo "点菜结束"
break
;;

*)
echo "点菜错误,请重新选择"
;;

esac
done

echo "总价是$sum"

image.png