第十三章 shell回圈 (loop)
来源:互联网 发布:程序员未来的发展趋势 编辑:程序博客网 时间:2024/05/18 00:56
除了 if...then...fi 这种条件判断式之外,回圈可能是程序当中最重要的一环了~ 回圈可以不断的运行某个程序段落,直到使用者配置的条件达成为止。 所以,重点是那个『条件的达成』是什么。除了这种依据判断式达成与否的不定回圈之外, 还有另外一种已经固定要跑多少次的回圈形态,可称为固定回圈的形态呢!底下我们就来谈一谈:
while do done, until do done (不定回圈)
一般来说,不定回圈最常见的就是底下这两种状态了:
while 的中文是『当....时』,所以,这种方式说的是『当 condition 条件成立时,就进行回圈,直到 condition 的条件不成立才停止』的意思。还有另外一种不定回圈的方式:
这种方式恰恰与 while 相反,它说的是『当 condition 条件成立时,就终止回圈, 否则就持续进行回圈的程序段。』是否刚好相反啊~我们以 while 来做个简单的练习好了。 假设我要让使用者输入 yes 或者是 YES 才结束程序的运行,否则就一直进行告知使用者输入字串。
上面这个例题的说明是『当 $yn 这个变量不是 "yes" 且 $yn 也不是 "YES" 时,才进行回圈内的程序。』 而如果 $yn 是 "yes" 或 "YES" 时,就会离开回圈罗~那如果使用 until 呢?呵呵有趣罗~ 他的条件会变成这样:
仔细比对一下这两个东西有啥不同喔! ^_^再来,如果我想要计算 1+2+3+....+100 这个数据呢? 利用回圈啊~他是这样的:
嘿嘿!当你运行了『 sh sh14.sh 』之后,就可以得到 5050 这个数据才对啊!这样了呼~ 那么让你自行做一下,如果想要让使用者自行输入一个数字,让程序由 1+2+... 直到你输入的数字为止, 该如何撰写呢?应该很简单吧?答案可以参考一下习题练习里面的一题喔!
for...do...done (固定回圈)
相对於 while, until 的回圈方式是必须要『符合某个条件』的状态, for 这种语法,则是『 已经知道要进行几次回圈』的状态!他的语法是:
以上面的例子来说,这个 $var 的变量内容在回圈工作时:
第一次回圈时, $var 的内容为 con1 ;
第二次回圈时, $var 的内容为 con2 ;
第三次回圈时, $var 的内容为 con3 ;
....
我们可以做个简单的练习。假设我有三种动物,分别是 dog, cat, elephant 三种, 我想每一行都输出这样:『There are dogs...』之类的字样,则可以:
等你运行之后就能够发现这个程序运行的情况啦!让我们想像另外一种状况,由於系统上面的各种帐号都是写在 /etc/passwd 内的第一个栏位,你能不能透过管线命令的 cut 捉出单纯的帐号名称后,以 id 及 finger 分别检查使用者的识别码与特殊参数呢?由於不同的 Linux 系统上面的帐号都不一样!此时实际去捉 /etc/passwd 并使用回圈处理,就是一个可行的方案了!程序可以如下:
运行上面的脚本后,你的系统帐号就会被捉出来检查啦!这个动作还可以用在每个帐号的删除、重整上面呢! 换个角度来看,如果我现在需要一连串的数字来进行回圈呢?举例来说,我想要利用 ping 这个可以判断网络状态的命令, 来进行网络状态的实际侦测时,我想要侦测的网域是本机所在的 192.168.1.1~192.168.1.100,由於有 100 台主机, 总不会要我在 for 后面输入 1 到 100 吧?此时你可以这样做喔!
上面这一串命令运行之后就可以显示出 192.168.1.1~192.168.1.100 共 100 部主机目前是否能与你的机器连通! 如果你的网域与鸟哥所在的位置不同,则直接修改上头那个 network 的变量内容即可!其实这个范例的重点在 $(seq ..) 那个位置!那个 seq 是连续 (sequence) 的缩写之意!代表后面接的两个数值是一直连续的! 如此一来,就能够轻松的将连续数字带入程序中罗!
最后,让我们来玩判断式加上回圈的功能!我想要让使用者输入某个目录档名, 然后我找出某目录内的档名的权限,该如何是好?呵呵!可以这样做啦~
呵呵!很有趣的例子吧~利用这种方式,你可以很轻易的来处理一些文件的特性呢。接下来,让我们来玩玩另一种 for 回圈的功能吧!主要用在数值方面的处理喔!
for...do...done 的数值处理
除了上述的方法之外,for 回圈还有另外一种写法!语法如下:
这种语法适合於数值方式的运算当中,在 for 后面的括号内的三串内容意义为:
A 初始值:某个变量在回圈当中的起始值,直接以类似 i=1 配置好;
B 限制值:当变量的值在这个限制值的范围内,就继续进行回圈。例如 i<=100;
C 运行步阶:每作一次回圈时,变量的变化量。例如 i=i+1。
值得注意的是,在『运行步阶』的配置上,如果每次添加 1 ,则可以使用类似『i++』的方式,亦即是 i 每次回圈都会添加一的意思。好,我们以这种方式来进行 1 累加到使用者输入的回圈吧!
一样也是很简单吧!利用这个 for 则可以直接限制回圈要进行几次呢!
转自:http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_5.php
while do done, until do done (不定回圈)
一般来说,不定回圈最常见的就是底下这两种状态了:
while [ condition ] <==中括号内的状态就是判断式do <==do 是回圈的开始!程序段落done <==done 是回圈的结束
while 的中文是『当....时』,所以,这种方式说的是『当 condition 条件成立时,就进行回圈,直到 condition 的条件不成立才停止』的意思。还有另外一种不定回圈的方式:
until [ condition ]do程序段落done
这种方式恰恰与 while 相反,它说的是『当 condition 条件成立时,就终止回圈, 否则就持续进行回圈的程序段。』是否刚好相反啊~我们以 while 来做个简单的练习好了。 假设我要让使用者输入 yes 或者是 YES 才结束程序的运行,否则就一直进行告知使用者输入字串。
[root@www scripts]# vi sh13.sh#!/bin/bash# Program:#Repeat question until user input correct answer.# History:# 2005/08/29VBirdFirst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHwhile [ "$yn" != "yes" -a "$yn" != "YES" ]doread -p "Please input yes/YES to stop this program: " yndoneecho "OK! you input the correct answer."
上面这个例题的说明是『当 $yn 这个变量不是 "yes" 且 $yn 也不是 "YES" 时,才进行回圈内的程序。』 而如果 $yn 是 "yes" 或 "YES" 时,就会离开回圈罗~那如果使用 until 呢?呵呵有趣罗~ 他的条件会变成这样:
[root@www scripts]# vi sh13-2.sh#!/bin/bash# Program:#Repeat question until user input correct answer.# History:# 2005/08/29VBirdFirst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHuntil [ "$yn" == "yes" -o "$yn" == "YES" ]doread -p "Please input yes/YES to stop this program: " yndoneecho "OK! you input the correct answer."
仔细比对一下这两个东西有啥不同喔! ^_^再来,如果我想要计算 1+2+3+....+100 这个数据呢? 利用回圈啊~他是这样的:
[root@www scripts]# vi sh14.sh#!/bin/bash# Program:#Use loop to calculate "1+2+3+...+100" result.# History:# 2005/08/29VBirdFirst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHs=0 # 这是加总的数值变量i=0 # 这是累计的数值,亦即是 1, 2, 3....while [ "$i" != "100" ]doi=$(($i+1)) # 每次 i 都会添加 1 s=$(($s+$i)) # 每次都会加总一次!doneecho "The result of '1+2+3+...+100' is ==> $s"
嘿嘿!当你运行了『 sh sh14.sh 』之后,就可以得到 5050 这个数据才对啊!这样了呼~ 那么让你自行做一下,如果想要让使用者自行输入一个数字,让程序由 1+2+... 直到你输入的数字为止, 该如何撰写呢?应该很简单吧?答案可以参考一下习题练习里面的一题喔!
for...do...done (固定回圈)
相对於 while, until 的回圈方式是必须要『符合某个条件』的状态, for 这种语法,则是『 已经知道要进行几次回圈』的状态!他的语法是:
for var in con1 con2 con3 ...do程序段done
以上面的例子来说,这个 $var 的变量内容在回圈工作时:
第一次回圈时, $var 的内容为 con1 ;
第二次回圈时, $var 的内容为 con2 ;
第三次回圈时, $var 的内容为 con3 ;
....
我们可以做个简单的练习。假设我有三种动物,分别是 dog, cat, elephant 三种, 我想每一行都输出这样:『There are dogs...』之类的字样,则可以:
[root@www scripts]# vi sh15.sh#!/bin/bash# Program:# Using for .... loop to print 3 animals# History:# 2005/08/29VBirdFirst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHfor animal in dog cat elephantdoecho "There are ${animal}s.... "done
等你运行之后就能够发现这个程序运行的情况啦!让我们想像另外一种状况,由於系统上面的各种帐号都是写在 /etc/passwd 内的第一个栏位,你能不能透过管线命令的 cut 捉出单纯的帐号名称后,以 id 及 finger 分别检查使用者的识别码与特殊参数呢?由於不同的 Linux 系统上面的帐号都不一样!此时实际去捉 /etc/passwd 并使用回圈处理,就是一个可行的方案了!程序可以如下:
[root@www scripts]# vi sh16.sh#!/bin/bash# Program# Use id, finger command to check system account's information.# History# 2009/02/18 VBird first releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHusers=$(cut -d ':' -f1 /etc/passwd) # 撷取帐号名称for username in $users # 开始回圈进行!do id $username finger $usernamedone
运行上面的脚本后,你的系统帐号就会被捉出来检查啦!这个动作还可以用在每个帐号的删除、重整上面呢! 换个角度来看,如果我现在需要一连串的数字来进行回圈呢?举例来说,我想要利用 ping 这个可以判断网络状态的命令, 来进行网络状态的实际侦测时,我想要侦测的网域是本机所在的 192.168.1.1~192.168.1.100,由於有 100 台主机, 总不会要我在 for 后面输入 1 到 100 吧?此时你可以这样做喔!
[root@www scripts]# vi sh17.sh#!/bin/bash# Program# Use ping command to check the network's PC state.# History# 2009/02/18 VBird first releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHnetwork="192.168.1" # 先定义一个网域的前面部分!for sitenu in $(seq 1 100) # seq 为 sequence(连续) 的缩写之意do# 底下的程序在取得 ping 的回传值是正确的还是失败的! ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1# 开始显示结果是正确的启动 (UP) 还是错误的没有连通 (DOWN) if [ "$result" == 0 ]; then echo "Server ${network}.${sitenu} is UP." else echo "Server ${network}.${sitenu} is DOWN." fidone
上面这一串命令运行之后就可以显示出 192.168.1.1~192.168.1.100 共 100 部主机目前是否能与你的机器连通! 如果你的网域与鸟哥所在的位置不同,则直接修改上头那个 network 的变量内容即可!其实这个范例的重点在 $(seq ..) 那个位置!那个 seq 是连续 (sequence) 的缩写之意!代表后面接的两个数值是一直连续的! 如此一来,就能够轻松的将连续数字带入程序中罗!
最后,让我们来玩判断式加上回圈的功能!我想要让使用者输入某个目录档名, 然后我找出某目录内的档名的权限,该如何是好?呵呵!可以这样做啦~
[root@www scripts]# vi sh18.sh#!/bin/bash# Program:#User input dir name, I find the permission of files.# History:# 2005/08/29VBirdFirst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATH# 1. 先看看这个目录是否存在啊?read -p "Please input a directory: " dirif [ "$dir" == "" -o ! -d "$dir" ]; thenecho "The $dir is NOT exist in your system."exit 1fi# 2. 开始测试文件罗~filelist=$(ls $dir) # 列出所有在该目录下的文件名称for filename in $filelistdoperm=""test -r "$dir/$filename" && perm="$perm readable"test -w "$dir/$filename" && perm="$perm writable"test -x "$dir/$filename" && perm="$perm executable"echo "The file $dir/$filename's permission is $perm "done
呵呵!很有趣的例子吧~利用这种方式,你可以很轻易的来处理一些文件的特性呢。接下来,让我们来玩玩另一种 for 回圈的功能吧!主要用在数值方面的处理喔!
for...do...done 的数值处理
除了上述的方法之外,for 回圈还有另外一种写法!语法如下:
for (( 初始值; 限制值; 运行步阶 ))do程序段done
这种语法适合於数值方式的运算当中,在 for 后面的括号内的三串内容意义为:
A 初始值:某个变量在回圈当中的起始值,直接以类似 i=1 配置好;
B 限制值:当变量的值在这个限制值的范围内,就继续进行回圈。例如 i<=100;
C 运行步阶:每作一次回圈时,变量的变化量。例如 i=i+1。
值得注意的是,在『运行步阶』的配置上,如果每次添加 1 ,则可以使用类似『i++』的方式,亦即是 i 每次回圈都会添加一的意思。好,我们以这种方式来进行 1 累加到使用者输入的回圈吧!
[root@www scripts]# vi sh19.sh#!/bin/bash# Program:# Try do calculate 1+2+....+${your_input}# History:# 2005/08/29VBirdFirst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHread -p "Please input a number, I will count for 1+2+...+your_input: " nus=0for (( i=1; i<=$nu; i=i+1 ))dos=$(($s+$i))doneecho "The result of '1+2+3+...+$nu' is ==> $s"
一样也是很简单吧!利用这个 for 则可以直接限制回圈要进行几次呢!
转自:http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_5.php
0 0
- 第十三章 shell回圈 (loop)
- 回圈 (loop)--for...do...done (固定回圈)
- shell script--回圈
- 回圈 (loop)--while do done, until do done (不定回圈)
- 第十三章 shell script
- Windows Shell 编程 第十三章
- Windows Shell 编程 第十三章
- 第十三章、学习 Shell Scripts
- 第十三章 学习Shell Scripts
- [转]Windows Shell 编程 第十三章
- 第十三章 简单的 shell script 练习
- 第十三章 shell 善用判断式
- 第十三章 shell条件判断式
- Unix Shell - Loop statement
- for&while loop/shell
- linux shell----for Loop
- linux shell ----while Loop
- shell循环loop
- Google 如何修复 X509TrustManager 实施方式不安全的应用
- JAVA虚拟机原理初探
- 第十三章 shell 善用判断式
- 第十三章 shell条件判断式
- Java中print、printf、println的区别
- 第十三章 shell回圈 (loop)
- Spring Boot 入门
- 初学正则表达式
- 第十三章 shell script 的追踪与 debug
- MySQL if case语句使用总结
- 第十四章 Linux 的账号与群组
- atom markdown转换PDF 解决AssertionError: html-pdf: Failed to load PhantomJS module
- mysql 存储过程例子
- MTK SmartPhone Record-(4)