Chinaunix首页 | 论坛 | 博客
  • 博客访问: 70861
  • 博文数量: 44
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-19 16:49
文章分类

全部博文(44)

文章存档

2018年(2)

2017年(1)

2016年(41)

我的朋友

分类: 系统运维

2016-04-29 17:24:42

原文地址:shell循环语法 作者:w787815


    1. shell循环语法
    2. while do done, until do done (不定回圈)
    3. 一般来说,不定回圈最常见的就是底下这两种状态了:

    4. while [ condition ] <==中括号内的状态就是判断式
    5. do <==do 是回圈的开始!
    6.     程序段落
    7. done <==done 是回圈的结束
    8. while 的中文是『当....时』,所以,这种方式说的是『当 condition 条件成立时,就进行回圈,直到 condition 的条件不成立才停止』的意思。

    9.  
    10. 还有另外一种不定回圈的方式:

    11. until [ condition ]
    12. do
    13.     程序段落
    14. done
    15. 这种方式恰恰与 while 相反,它说的是『当 condition 条件成立时,就终止回圈, 否则就持续进行回圈的程序段。』是否刚好相反啊

    16.  

    17. 我们以 while 来做个简单的练习好了。 假设我要让使用者输入 yes 或者是 YES 才结束程序的运行,否则就一直进行告知使用者输入字串。

    18. [root@www scripts]# vi sh13.sh
    19. #!/bin/bash
    20. # Program:
    21. # Repeat question until user input correct answer.
    22. # History:
    23. # 2005/08/29 VBird First release
    24. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    25. export PATH

    26. while [ "$yn" != "yes" -a "$yn" != "YES" ]
    27. do
    28.     read -p "Please input yes/YES to stop this program: " yn
    29. done
    30. echo "OK! you input the correct answer."


    31. 上面这个例题的说明是『当 $yn 这个变量不是 "yes" 且 $yn 也不是 "YES" 时,才进行回圈内的程序。』 而如果 $yn 是 "yes""YES" 时,就会离开回圈罗~那如果使用 until 呢?呵呵有趣罗~ 他的条件会变成这样:

    32. [root@www scripts]# vi sh13-2.sh
    33. #!/bin/bash
    34. # Program:
    35. # Repeat question until user input correct answer.
    36. # History:
    37. # 2005/08/29 VBird First release
    38. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    39. export PATH

    40. until [ "$yn" == "yes" -o "$yn" == "YES" ]
    41. do
    42.     read -p "Please input yes/YES to stop this program: " yn
    43. done
    44. echo "OK! you input the correct answer."
    45.  

    46. 仔细比对一下这两个东西有啥不同喔! ^_^再来,如果我想要计算 1+2+3+....+100 这个数据呢? 利用回圈啊~他是这样的:

    47. [root@www scripts]# vi sh14.sh
    48. #!/bin/bash
    49. # Program:
    50. # Use loop to calculate "1+2+3+...+100" result.
    51. # History:
    52. # 2005/08/29 VBird First release
    53. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    54. export PATH

    55. s=0 # 这是加总的数值变量
    56. i=0 # 这是累计的数值,亦即是 1, 2, 3....
    57. while [ "$i" != "100" ]
    58. do
    59.     i=$(($i+1)) # 每次 i 都会添加 1
    60.     s=$(($s+$i)) # 每次都会加总一次!
    61. done
    62. echo "The result of '1+2+3+...+100' is ==> $s"
    63.  

    64. for...do...done(固定循环)
    65. 他的语法是:

    66. for var in con1 con2 con3 ...
    67. do
    68.     程序段
    69. done
    70. 以上面的例子来说,这个 $var 的变量内容在回圈工作时:

    71. 第一次回圈时, $var 的内容为 con1 ;
    72. 第二次回圈时, $var 的内容为 con2 ;
    73. 第三次回圈时, $var 的内容为 con3 ;
    74. ....
    75. 我们可以做个简单的练习。假设我有三种动物,分别是 dog, cat, elephant 三种, 我想每一行都输出这样:『There are dogs...』之类的字样,则可以:

    76. [root@www scripts]# vi sh15.sh
    77. #!/bin/bash
    78. # Program:
    79. # Using for .... loop to print 3 animals
    80. # History:
    81. # 2005/08/29 VBird First release
    82. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    83. export PATH

    84. for animal in dog cat elephant
    85. do
    86.     echo "There are ${animal}s.... "
    87. done
    88.  

    89. 我想要侦测的网域是本机所在的 192.168.1.1~192.168.1.100,由於有 100 台主机, 总不会要我在 for 后面输入 1 到 100 吧?此时你可以这样做喔!

    90. [root@www scripts]# vi sh17.sh
    91. #!/bin/bash
    92. # Program
    93. # Use ping command to check the network's PC state.
    94. # History
    95. # 2009/02/18 VBird first release
    96. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    97. export PATH
    98. network="192.168.1" # 先定义一个网域的前面部分!
    99. for sitenu in $(seq 1 100) # seq 为 sequence(连续) 的缩写之意
    100. do
    101.     # 底下的程序在取得 ping 的回传值是正确的还是失败的!
    102.         ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
    103.     # 开始显示结果是正确的启动 (UP) 还是错误的没有连通 (DOWN)
    104.         if [ "$result" == 0 ]; then
    105.                 echo "Server ${network}.${sitenu} is UP."
    106.         else
    107.                 echo "Server ${network}.${sitenu} is DOWN."
    108.         fi
    109. done
    110.  

    111. 我想要让使用者输入某个目录档名, 然后我找出某目录内的档名的权限,该如何是好?


    112. [root@www scripts]# vi sh18.sh
    113. #!/bin/bash
    114. # Program:
    115. # User input dir name, I find the permission of files.
    116. # History:
    117. # 2005/08/29 VBird First release
    118. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    119. export PATH

    120. # 1. 先看看这个目录是否存在啊?
    121. read -p "Please input a directory: " dir
    122. if [ "$dir" == "" -o ! -d "$dir" ]; then
    123.     echo "The $dir is NOT exist in your system."
    124.     exit 1
    125. fi

    126. # 2. 开始测试文件罗~
    127. filelist=$(ls $dir) # 列出所有在该目录下的文件名称
    128. for filename in $filelist
    129. do
    130.     perm=""
    131.     test -r "$dir/$filename" && perm="$perm readable"
    132.     test -w "$dir/$filename" && perm="$perm writable"
    133.     test -x "$dir/$filename" && perm="$perm executable"
    134.     echo "The file $dir/$filename's permission is $perm "
    135. done

    136.  

    137. for...do...done 的数值处理
    138. 除了上述的方法之外,for 回圈还有另外一种写法!语法如下:

    139. for (( 初始值; 限制值; 运行步阶 ))
    140. do
    141.     程序段
    142. done
    143. 这种语法适合於数值方式的运算当中,在 for 后面的括号内的三串内容意义为:

    144. 初始值:某个变量在回圈当中的起始值,直接以类似 i=1 配置好;
    145. 限制值:当变量的值在这个限制值的范围内,就继续进行回圈。例如 i<=100;
    146. 运行步阶:每作一次回圈时,变量的变化量。例如 i=i+1。
    147. 值得注意的是,在『运行步阶』的配置上,如果每次添加 1 ,则可以使用类似『i++』的方式,亦即是 i 每次回圈都会添加一的意思。好,我们以这种方式来进行 1 累加到使用者输入的回圈吧!


    148. [root@www scripts]# vi sh19.sh
    149. #!/bin/bash
    150. # Program:
    151. # Try do calculate 1+2+....+${your_input}
    152. # History:
    153. # 2005/08/29 VBird First release
    154. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    155. export PATH

    156. read -p "Please input a number, I will count for 1+2+...+your_input: " nu

    157. s=0
    158. for (( i=1; i<=$nu; i=i+1 ))
    159. do
    160.     s=$(($s+$i))
    161. done
    162. echo "The result of '1+2+3+...+$nu' is ==> $s


阅读(856) | 评论(0) | 转发(0) |
0

上一篇:shell read

下一篇:shell条件判断式

给主人留下些什么吧!~~