shell循环判断语法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell循环判断语法相关的知识,希望对你有一定的参考价值。

for循环

for循环数字1-100得出数字1到100的和

[[email protected] src]# cat fors.sh 
#!/bin/bash
sum=0
for a in `seq 1 100`
 do
 ? sum=$[$a+$sum]
 done
echo $sum 
[[email protected] src]# sh -x fors.sh 
+ sum=0 ? ? ? ? ? ?  部分执行过程
++ seq 1 100
+ for a in ‘`seq 1 100`‘
+ sum=1
+ for a in ‘`seq 1 100`‘
+ sum=3
+ for a in ‘`seq 1 100`‘
+ sum=6
.................省略
+ for a in ‘`seq 1 100`‘
+ sum=4851
+ for a in ‘`seq 1 100`‘
+ sum=4950
+ for a in ‘`seq 1 100`‘
+ sum=5050
+ echo 5050

for循环遍历出文件或目录,这里遍历出某个目录下的所有目录。使用if ?-d来判断是否是个目录

[[email protected] src]# cat fors.sh
#!/bin/bash
cd /usr/local/src/
for a in `ls /usr/local/src`
 do
 ?if [ -d $a ]
 ? ?then
 ? echo $a
 ?fi 
 done 
[[email protected] src]# sh fors.sh 
cmake-3.12.2
nginx-1.15.2
php-5.6.37
php-7.1.21
zabbix-3.4.13

for循环会对空格和回车符作为分割符处理,在遍历后会把以空格相连的文件名会处理成两个文件(会变为两个文件名称来显示),如有以下几个文件:

[[email protected] src]# ll *.txt
-rw-r--r-- 1 root root 75 Sep 17 16:32 1.txt
-rw-r--r-- 1 root root 0 Sep 17 16:32 2.txt
-rw-r--r-- 1 root root 0 Sep 17 16:32 5 3.txt
[[email protected] src]# sh foss.sh 
/usr/local/src/1.txt
/usr/local/src/2.txt
/usr/local/src/5
3.txt

for循环处理空格分割的文件或字符串时会把空格作为换行符来处理,导致一个含有空格的目录或文件的一串字符会变为两串字符

while循环

语法 while 条件; do 语句; done ? ? ? ?//这个写法的 true和while :; ?表示死循环

这里使用while循环简单判断监控一个数值,如果获取的数值大于特定值则执行某些操作,操作可以是执行发送邮件,sleep表示每隔多少秒执行一次整个循环

[[email protected] src]# cat while.sh 
#!/bin/bash
while true
 do
 ? load=`w |head -1 |awk -F ‘load average:‘ ‘{print $2}‘ |cut -d. -f1`
 ? ?if [ $load -gt 10 ]
 ? ? ?then 
 ? ? ? ? echo "1234" ? ? ? ?  //这里也可以是发送邮件的命令
 ? ?fi
 ? ? ? sleep 10
 ?done

while结合if来判断一个输入的数值是否符合规则
while循环输入一个 数值来正确判断,来判断输入的值是否是一个纯数字,如果不是则会继续执行循环让继续来输入值,直到输入正确为止,直至输入正确后才会结束并退出这个while循环
第一次read -p把输入值赋予给变量n,让变量n和一个特定值做下比对,如果符合条件则跳过这个判断结果并使用continue结束单次循环并echo出结果。
如果输入的字符不为数字,且变量不是空的话,那么该次判断不会结束循环并往下执行。将输入变量所有的数字替换为空。
如果包含字母则无法替换为空。并且把替换的这个结果做一个非空判断,如果输入的是数字的话,那么这个值已经被替换成空的了。如果是非数字则不能针对字母做替换,然后继续循环让输入一个纯数字

while :;
 ? do
 ? ? read -p "Please input a number: "  n
 ?if [ -z "$n" ]
 ? ? then
 ? ? ? echo "输入验证"
 ? ? ? ? continue
 ?fi
 ? ?n1=`echo $n |sed ‘s/[-0-9]//g‘`
 ?if [ ! ?-z "$n1" ]
 ? ? then 
 ? ? ? echo "请输入一个纯数字"
 ? ? ? ? continue
 ?fi
 ? ? break
done
echo $n

break跳出循环

在循环判断中,如果获取的一个变量大于或等于特定值时,则会执行该判断下的执行语句,这个语句且是break跳出动作并继续执行脚本中剩下的语句,那么这个循环如果等于或大于这个特定值就会执行break,执行break后,则这个循环中还有其他语句或判断的话则不会去执行了,直接终止这个循环语句

[[email protected] src]# cat while.sh 
#!/bin/bash
for i in `seq 1 4`
do 
 echo $i
 ? if [ $i -eq 3 ]
 ? ? then
 ? ? ?  break
 ? fi
 ?echo $i
done
echo abc 
[[email protected] src]# sh  while.sh 
1
1
2
2
3
abc

continue结束本次循环

continue结束的循环是匹配特定值的本次循环。如果获取的数值等于或大于特定值,则结束本次循环,并终止执行continue以下的语句。但是结束本次循环后并非退出循环,而是继续从循环中获取数据来执行特定语句,直到这个循环范围结束(如1-6、a-f ?等)

[[email protected] src]# cat continue.sh 
#!/bin/bash
for i in `seq 1 4`
do 
 echo $i
 ? if [ $i -eq 3 ]
 ? ? then
 ? ? ?  continue
 ? fi
 ?echo $i
done
echo abc 
[[email protected] src]# sh while.sh 
1
1
2
2
3
4
4
5
5
abc

exit退出整个脚本

如果判断一个从循环获取的变量大于或等于特定值,恰好循环获取的值匹配上了特定值时,则会执行该判断下的语句和exit退出动作,exit ?退出表示我之下的所有内容和不在我这个循环内的内容都不执行了,直接退出整个脚本

?

[[email protected] src]# cat exit.sh 
#!/bin/bash
for i in `seq 1 5`
do
 ? ?echo $i
 ? ?if [ $i == 3 ]
 ? ?then
 ? ? ? ?exit
 ? ?fi
 ? ?echo $i
done
echo aaaaaaa

以上是关于shell循环判断语法的主要内容,如果未能解决你的问题,请参考以下文章

Shell中条件判断语法与判断条件

linux shell脚本基本语法

linux shell脚本基本语法

linux shell脚本基本语法

linux shell 基础语法A-2

shell里while循环语法怎么写?