shell循环-双重循环

264 阅读2分钟

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

exit 1.png

exit 1.结果.png

#!/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

循环一次.png

循环一次结果.png

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

循环到3退出.png

循环到3退出结果.png

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

break.png

break结果.png

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

continue.png

continue结果.png

示例

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

解析IP地址.png

解析IP地址结果.png

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有执行权限

查看执行权限.png

执行权限结果.png