首页 > 代码库 > 第十三章、学习 Shell Scripts 循环 (loop)
第十三章、学习 Shell Scripts 循环 (loop)
while do done, until do done (不定循环)
while [ condition ] <==中括号内的状态就是判断式do <==do 是回圈的开始! 程序段落done <==done 是回圈的结束 |
until [ condition ]do 程序段落done |
[root@www scripts]# vi sh13.sh#!/bin/bash# Program:# Repeat question until user input correct answer.# History:# 2005/08/29 VBird First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHwhile [ "$yn" != "yes" -a "$yn" != "YES" ]do read -p "Please input yes/YES to stop this program: " yndoneecho "OK! you input the correct answer." |
[root@www scripts]# vi sh13-2.sh#!/bin/bash# Program:# Repeat question until user input correct answer.# History:# 2005/08/29 VBird First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHuntil [ "$yn" == "yes" -o "$yn" == "YES" ]do read -p "Please input yes/YES to stop this program: " yndoneecho "OK! you input the correct answer." |
[root@www scripts]# vi sh14.sh#!/bin/bash# Program:# Use loop to calculate "1+2+3+...+100" result.# History:# 2005/08/29 VBird First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHs=0 # 这是加总的数值变量i=0 # 这是累计的数值,亦即是 1, 2, 3....while [ "$i" != "100" ]do i=$(($i+1)) # 每次 i 都会添加 1 s=$(($s+$i)) # 每次都会加总一次!doneecho "The result of ‘1+2+3+...+100‘ is ==> $s" |
for...do...done (固定回圈)
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/29 VBird First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHfor animal in dog cat elephantdo echo "There are ${animal}s.... "done |
[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 |
[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/29 VBird First 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" ]; then echo "The $dir is NOT exist in your system." exit 1fi# 2. 开始测试文件罗~filelist=$(ls $dir) # 列出所有在该目录下的文件名称for filename in $filelistdo perm="" 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...do...done 的数值处理
for (( 初始值; 限制值; 运行步阶 ))do 程序段done |
- 初始值:某个变量在回圈当中的起始值,直接以类似 i=1 配置好;
- 限制值:当变量的值在这个限制值的范围内,就继续进行回圈。例如 i<=100;
- 运行步阶:每作一次回圈时,变量的变化量。例如 i=i+1。
值得注意的是,在『运行步阶』的配置上,如果每次添加 1 ,则可以使用类似『i++』的方式,亦即是 i 每次回圈都会添加一的意思。
[root@www scripts]# vi sh19.sh#!/bin/bash# Program:# Try do calculate 1+2+....+${your_input}# History:# 2005/08/29 VBird First 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 ))do s=$(($s+$i))doneecho "The result of ‘1+2+3+...+$nu‘ is ==> $s" |
第十三章、学习 Shell Scripts 循环 (loop)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。