shell整理(30)====嵌套循环shell写找勾股数和shift命令
(一)题目:找出100 以内的勾股数 shell 代码如下: #!/bin/bash foriin`seq100` do forjin`seq$i100`#这样就解决了重复的问题 do例如345和435 forxin`seq$j100` do a=$((i*i)) b=$((j*j)) c=$((x*x)) d=$(($a+$b)) if[[$d=$c]] then echo$i$j$x fi done done done 输出如下: [root@localhost ding]# [root@localhost ding]# bash 6.sh #有没有发现输出结果第二列都比第一列数字大 3 4 5 5 12 13 6 8 10 7 24 25 8 15 17 9 12 15 9 40 41 10 24 26 11 60 61 ............... 利用上面这个原理我们可以打印一个九九乘法表 shell 代码如下: #!/bin/bash foriin`seq9` do forjin`seq$i`#这地方写成$i就比写成seq9方便多了呢 do echo-n"$i*$j=$(($i*$j))"#有一个空格 done echo内层循环完成以后换行 done echo 输出结果如下: [root@localhost ding]# bash 7.sh #外层决定有多少行,内层决定有多少列 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 代码稍作改变,也可以变成这样:哈哈 例如 [root@localhost ding]# bash 7.sh 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*6=36 6*7=42 6*8=48 6*9=54 7*7=49 7*8=56 7*9=63 8*8=64 8*9=72 9*9=81 代码如下: #!/bin/bash foriin`seq9` do forjin`seq$i9` do echo-n"$i*$j=$(($i*$j))" done echo done echo 如果你九九乘法表的原理明白了,那么打印这个也是同样的原理呢?把上面所有黄色标记都打印出来 例如: [root@localhost ding]# bash 10.sh 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 shell 代码如下 #!/bin/bash foriin`seq9` do forjin`seq$i`#这三个是不是很像呢 do echo-n"$j"#有一个空格,不然全都堆在一起了 done echo#内层循环完成以后换行 done 上面虽然没有什么命令,但是你必须深入了解for循环是怎么循环的才能写出来,第一个是三层嵌套循环 后两个是二层嵌套 当i=1,里面循环1次,分别打印出来 当i=2,里面循环2次,分别打印出来 当i=3,里面循环3次,分别打印出来 .............................. (二) shift 命令的一个简单应用 例如: 【root@localhost ding]# bash 1.sh `seq 9` #`seq 9` 可以改成${a..z} 或 ${1..9}看效果 1 2 3 4 5 6 7 8 9 #9个数 2 3 4 5 6 7 8 9#8个数 3 4 5 6 7 8 9 4 5 6 7 8 9 5 6 7 8 9 6 7 8 9 7 8 9 8 9 9#一个数 shell 代码如下: #!/bin/bash while (($# > 0)) #这地方可以用[[ $# > 0 ]] 但是不能写成[ $# -ge 0 ],因为[ ]只支持 do简单的比较,不支持逻辑比较 echo $@ #这个地方写$#和$* 都可以 shift done shift 其实就是向左移动,每循环一次,就把$1去掉,如果后面不加数字,默认去掉一个数。$2就变成$1打印出来。 例如我们这样: #!/bin/bash echo $# while [[ $# > 0 ]] do echo $@ shift 3 #没次去掉$1.$2.$3 done 执行结果: root@localhost ding]# bash 1.sh a b c d d e #后面加的数必须能被3整除,不然报错 6 a b c d d e d d e [root@localhost ding]# 在例如我们这样测试一下: #!/bin/bash echo $# while [[ $# > 0 ]] do echo $@ shift 3 #决定循环多少次 echo $1 done 输出: [root@localhost ding]# bash 1.sh a b c d d e 6 # $#的值 a b c d d e # $@的值(第一次循环) d# shift 3 以后的$1 d d e# $@的值 (第二次循环) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |