1.双重循环概述
循环必须是有规律的递增或递减,脚本从上至下执行,在没有break、exit、sleep、continue等结束语句时,循环语句块会逐条执行。
内层循环是外层循坏的一条循环语句,当变量满足外层循环的条件时,就会进入外层循环执行外层循环语句,当变量满足内层循环的条件时,转而执行内层循环,只有当内层循环结束才会跳出内层循环,然后继续外层循环语句的执行
退出循环
外层循环一次,内层循环四次; 外层循环四次,内层循环十六次
[root@localhost djq]# vim exit.sh
#!/bin/bash
#exit退出循环
for ((i=1; i<=4; i++))
do
echo "$i"
for ((a=1; a<=4; a++))
do
echo " $a"
done
done
[root@localhost djq]# ./exit.sh
1
1
2
3
4
2
1
2
3
4
3
1
2
3
4
4
1
2
3
4
#!/bin/bash
#exit退出循环
for ((i=1; i<=4; i++))
do
echo "$i"
for ((a=1; a<=4; a++))
do
echo " $a"
done
exit ##外部循环一次,内部循环四次,退出循环。
done
[root@localhost djq]# ./exit.sh
1
1
2
3
4
exit退出
退出当前shell脚本。脚本中exit执行后,脚本后面所有的语句都不会被执行
#!/bin/bash
#exit退出循环
for ((i=1; i<=4; i++))
do
echo "$i"
for ((a=1; a<=4; a++))
do
echo " $a"
exit 3
done
done
[root@localhost djq]# ./exit.sh
1
1
[root@localhost djq]# echo $?
3
break
跳出当前循环,默认为break 1,后面数字为跳出层数,例如break 2为跳出2层循环。
循环内break之后的语句都不会执行,但循环外的语句仍然会执行
#!/bin/bash
#exit退出循环
for ((i=1; i<=4; i++))
do
echo "$i"
for ((a=1; a<=4; a++))
do
echo " $a"
break
done
done
[root@localhost djq]# ./exit.sh
1
1
2
1
3
1
4
1
continue
终止某次循环中的命令,但不会完全终止整个命令,而是直接跳过满足条件的循环,即满足条件不循环,继而循环不满足的条件。【continue一般用于for循环。在while和until中要注意,如果变量迭代语句放在continue之后,那么迭代不会执行,会造成死循环。】
#!/bin/bash
#exit退出循环
for ((i=1; i<=4; i++))
do
echo "$i"
for ((a=1; a<=4; a++))
do
if [ $a -eq 2 ];then
continue
fi
echo " $a"
done
done
[root@localhost djq]# ./exit.sh
1
1
3
4
2
1
3
4
3
1
3
4
4
1
3
4
示例
1.将IP地址转化为二进制数值
#!/bin/bash
#将IP地址转化为二进制模式
read -p "请输入IP地址:" ip
#用一个变量保存IFS原始值
IFS_OLD=$IFS
#将选择“.”为分隔符
IFS='.'
a=0
for num in $ip
do
sum=
for i in {1..8}
do
#余数倒排法
var=$[num%2]
sum=$var$sum
num=$[num/2]
done
echo -n "$sum"
let a++
if [ $a -le 3 ];then
echo -n "."
fi
done
#输出空格换行
echo " "
IFS=$IFS_OLD
[root@localhost djq]# ./yi.sh
请输入IP地址:192.168.132.132
11000000.10101000.10000100.10000100
2.输出环境变量PATH的目录所包含的所有可执行文件。
[root@localhost djq]# vim ll.sh
#!/bin/bash
#输出环境变量 PATH的目录所包含的所有可执行文件
IFS_OLD=$IFS
IFS=$IFS':'
for i in $PATH
do
for a in $(find $i -type f)
do
if [ -x $a ];then
echo "$a有执行权限"
fi
done
done
IFS=$IFS_OLD
/usr/bin/scl_enabled有执行权限
/usr/bin/readom有执行权限
/usr/bin/dehtmldiff有执行权限
/usr/bin/cscope-indexer有执行权限
/usr/bin/diffstat有执行权限
/usr/bin/rdate有执行权限
/usr/bin/ctags有执行权限
/usr/bin/setserial有执行权限