shell循环判断语法

for循环

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

[root@localhost src]# cat fors.sh 
#!/bin/bash
sum=0
for a in `seq 1 100`
 do
   sum=$[$a+$sum]
 done
echo $sum 
[root@localhost 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来判断是否是个目录

[root@localhost 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 
[root@localhost 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循环会对空格和回车符作为分割符处理,在遍历后会把以空格相连的文件名会处理成两个文件(会变为两个文件名称来显示),如有以下几个文件:

[root@localhost 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
[root@localhost 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表示每隔多少秒执行一次整个循环

[root@localhost 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后,则这个循环中还有其他语句或判断的话则不会去执行了,直接终止这个循环语句

[root@localhost 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 
[root@localhost src]# sh  while.sh 
1
1
2
2
3
abc

continue结束本次循环

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

[root@localhost 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 
[root@localhost src]# sh while.sh 
1
1
2
2
3
4
4
5
5
abc

exit退出整个脚本

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

[root@localhost 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

猜你喜欢

转载自blog.51cto.com/8844414/2176405