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循环判断语法的主要内容,如果未能解决你的问题,请参考以下文章