zoukankan      html  css  js  c++  java
  • 第十三章、学习 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 release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    while [ "$yn" != "yes" -a "$yn" != "YES" ]
    do
    	read -p "Please input yes/YES to stop this program: " yn
    done
    echo "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 release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    until [ "$yn" == "yes" -o "$yn" == "YES" ]
    do
    	read -p "Please input yes/YES to stop this program: " yn
    done
    echo "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 release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    s=0  # 这是加总的数值变量
    i=0  # 这是累计的数值,亦即是 1, 2, 3....
    while [ "$i" != "100" ]
    do
    	i=$(($i+1))   # 每次 i 都会添加 1 
    	s=$(($s+$i))  # 每次都会加总一次!
    done
    echo "The result of '1+2+3+...+100' is ==> $s"
    

    for...do...done (固定回圈)

     for 这种语法,则是『 已经知道要进行几次回圈』的状态!他的语法是:

    for var in con1 con2 con3 ...
    do
    	程序段
    done
    

    以上面的例子来说,这个 $var 的变量内容在回圈工作时:

    1. 第一次回圈时, $var 的内容为 con1 ;
    2. 第二次回圈时, $var 的内容为 con2 ;
    3. 第三次回圈时, $var 的内容为 con3 ;
    4. ....

    我们可以做个简单的练习。假设我有三种动物,分别是 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 release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    for animal in dog cat elephant
    do
    	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 release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    users=$(cut -d ':' -f1 /etc/passwd)  # 撷取帐号名称
    for username in $users               # 开始回圈进行!
    do
            id $username
            finger $username
    done
    
    [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 release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    network="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."
            fi
    done
    

    上面这一串命令运行之后就可以显示出 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 release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    # 1. 先看看这个目录是否存在啊?
    read -p "Please input a directory: " dir
    if [ "$dir" == "" -o ! -d "$dir" ]; then
    	echo "The $dir is NOT exist in your system."
    	exit 1
    fi
    
    # 2. 开始测试文件罗~
    filelist=$(ls $dir)        # 列出所有在该目录下的文件名称
    for filename in $filelist
    do
    	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 release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    read -p "Please input a number, I will count for 1+2+...+your_input: " nu
    
    s=0
    for (( i=1; i<=$nu; i=i+1 ))
    do
    	s=$(($s+$i))
    done
    echo "The result of '1+2+3+...+$nu' is ==> $s"
    

     

  • 相关阅读:
    Prototype源码浅析——String部分(四)之补充
    改造alert的引发的争论【基本类型与引用类型】
    Eclipse rcp 窗口激活
    Eclipse statusLine 加入进度信息
    线的匹配
    python 文本搜索
    Eclipse rcp 编辑器行号显示
    CDT重建索引
    Eclipse rcp 数据存储
    CTabFolder 最大最小化
  • 原文地址:https://www.cnblogs.com/ghgyj/p/3983448.html
Copyright © 2011-2022 走看看