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
来源: http://www.bubuko.com/infodetail-2771837.html