4.控制流结构
    4.1.控制结构
        
    4.2.if then else语句
        格式:

if 条件1        //如果条件1为真
then
命令1 //那么,执行命令1
elif 条件2 //如果条件1不成立,而条件成立
then
命令2 //那么,执行命令2
……更多的elif then组合……
else
命令2 //如果条件1、2……都不成立,那么执行命令3
fi //完成,if语句必须以单词fi终止

最简可以是形式:

if 条件
then
命令
fi

等价于

if 条件; then
命令

;可以在脚本的一行里写多条命令
        例程1:

#!/bin/bash
#if test
if [ "10" -lt "12" ]
then
echo "Yes, 10 is less than 12"
else
echo "No"
fi

注意语法细节(在我的ubuntu 12.04 LTS中):
            1.if或elif与[ 之间必须有一个空格,否则会出错!!!
            2.条件的 [ 之后 和 ]之前也必须有一个空格
            经历
                因为没有注意这个细节,写的脚本会报出类似下面的错误
                    ./cpdir.sh: 行 10: if[ 2 -ne 2 ]: 未找到命令
                    ./cpdir.sh: 行 11: 未预期的符号 `then' 附近有语法错误
                    ./cpdir.sh: 行 11: `then'
            例子
                if [ "10" -lt "12" ]在if后有空格、[后有空格、]前有空格,这就是正确的
                if ["10" -lt "12"]在[后没空格、]前没空格就是错误的
        if和elif后的判断条件(用 man test 查看详细内容)
            [ EXPRESSION ]    EXPRESSION is true
            !EXPRESSION        EXPRESSION is false
            EXPRESSION1 -a EXPRESSION2    both EXPRESSION1 and EXPRESSION2 are true
            EXPRESSION1 -o EXPRESSION2    either EXPRESSION1 or EXPRESSION2 is true
            [ -n ] STRING        the length of STRING is nonzero
            -z STRING     the length of STRING is zero
            STRING1 = STRING2    the STRINGs are equal
            STRING1 != STRING2    the STRINGs are not equal
            INTEGER1 -eq INTEGER2    INTEGER1 is equal to INTEGER2
            INTEGER1 -ge INTEGER2    INTEGER1 is greater than or equal to INTEGER2
            INTEGER1 -gt INTEGER2    INTEGER1 is greater than INTEGER2
            INTEGER1 -le INTEGER2    INTEGER1 is less than or equal to INTEGER2
            INTEGER1 -lt INTEGER2    INTEGER1 is less than INTEGER2
            INTEGER1 -ne INTEGER2    INTEGER1 is not equal to INTEGER2
            FILE1 -ef FILE2        FILE1 and FILE2 have the same device and inode numbers
            FILE1 -nt FILE2        FILE1 is newer(modification data) than FILE2
            FILE1 -ot FILE2        FILE1 is older than FILE2
            -b FILE        FILE exists and is block special
            -c FILE        FILE exists and is character special
            -d FILE        FILE exists and is a directory
            -e FILE        FILE exists
            -f FILE        FILE exists and is a regular file
            -g FILE        FILE exists and is set-group-ID
            -G FILE        FILE exists and is owned by the effective group ID
            -k FILE        FILE exists and has its sticky bit set
            -L FILE        FILE exists and is a symbolic link
            -O FILE        FILE exists and is owned by the effective user ID
            -p FILE        FILE exists and is a named pipe
            -r FILE        FILE exists and is readable
            -s FILE        FILE exists and has a size greater than zero
            -S FILE        FILE exists and is a socket
            -f [ FD ]        file directory FD(stdout by default) is opened on a terminal
            -u FILE        FILE exists and its set-user-ID bit is set
            -w FILE        FILE exists and is writable
            -x FILE        FILE exists and is executable
        例程2:

#!/bin/bash
#if test2
echo -n "Enter your name:"
read NAME
#did the user just hit return
if[ "$NAME" = "" ]
#注意字符串变量比较的具体格式
then
echo "You did not enter any information"
else
echo "Your name is ${NMAE}"
#注意字符串变量输出使用的具体格式
fi

例程3:

#!/bin/bash
#if cp test
if cp myfile.bak myfile
then
echo "good copy"
else
echo "`basename $0`:error could not copy the files" > &2
fi

例程4:

#!/bin/bash
#if elif
echo -n "Enter your name:"
read NAME
if [ -z $NAME ] || [ "$NMAE"="" ]
then
echo "You did not enter a name"
elif [ "$NMAE"="root" ]
then
echo "Hello root"
elif[ "$NAME"="perfect" ]
then
echo "Hello perfect"
else
echo "You are not root or perfect, but hi $NAME"
fi

4.3.case语句
        格式:

case 值 in
模式1)
命令1
;;
模式2)
命令2
;;
esac

简介:
            case取值后面必须为单词 in ,每一模式必须以右括号结束。取值可以是变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;; 。模式匹配符 * 表示任意字符, ? 表示任意单个字符, [ .. ]表示类或范围中任意一个字符
        例程1:

#!/bin/bash
#case select
echo -n "Enter a number from 1/2/3/y/Y:"
read ANS
case $ANS in
1)
echo "You select 1"
;;
2)
echo "You select 2"
;;
3)
echo "You select 3"
;;
y|Y)
#y或者Y
echo "you select $ANS"
;;
*)
echo "`basename $0`:This is not between 1 and 3" > &2
exit;
;;
esac

例程2:
            
    4.4.for循环
        格式:

for 变量名 in 列表
do
命令1
命令2
……
done

简介:
            当变量值列表里,for循环即执行一次所有命令,使用变量名访问列表中取值。命令可为任何有效的shell命令和语句。变量名为任意单词。in列表用法是可选的,如果不用它,for循环使用命令行的位置参数。in列表可以包含替换、字符串和文件名
        例程1:

#!/bin/bash
#fortest1
for lop in 1 2 3 4 5
do
echo $loop
done

例程2:

#!/bin/bash
#fortest2
for loop in "orange red blue grey"
do
echo $loop
done
 

区别于

#!/bin/bash
#fortest2
for loop in orange red blue grey
do
echo $loop
done
 

例程3:

#!/bin/bash
#fortest3
for loop in `cat listfile`
#``反斜杠里可以放shell命令
#将listfile里面的字符串作为in的列表来用的具体格式(文件中的字符串以空格或回车作为分隔)
do
echo $loop
done

4.5.until循环
        格式:

until 条件
do
命令1
命令2
……
done

简介:
            条件可为任意测试条件,测试发生在循环末尾(先执行do和done中间的命令,再执行until里的判断,直到until里面的条件为真再停止循环),因此循环至少执行一次
        例程1(可以用于服务器管理员监控分区,循环执行检查分区使用是不是还在安全范围内,并将结果mail给系统管理员):

#!/bin/bash
#监控分区
#定义监控的分区
Part="/backup"
#得到磁盘使用的百分比
LOOK_OUT=`df | grep $Part | awk '{print $5}' | sed 's/%//g'` #这条语句将``里面命令执行的结果赋值给LOOK_OUT
echo $LOOK_OUT
until[ "LOOK_OUT" -gt "90" ]
do
echo "Filesystem /backup is nearly full" | mail root
LOOK_OUT=`df | grep $PART | awk '{print $5}' | sed 's/%//g'`
sleep 3600 #程序休眠一小时
done

4.6.while循环
        格式:

while 命令
do
命令1
命令2
……
done

while 条件
do
命令1
命令2
……
done

注意语法细节:
                1.while的条件放在 [] 中
                1.while与[ 之间必须有一个空格,否则会出错!!!
                2.条件的 [ 之后 和 ]之前也必须有一个空格
        简介:
            在while和do之间虽然通常指使用一个命令,但可以放几个命令,命令通常用作测试条件
        例程1:

#!/bin/bash
#whileread1
echo "按住 <ctrl>+D 退出输入"
while echo -n "输入你最喜欢的电影:";read FILM
do
echo "Yeah, ${FILM}是一部好电影"
done

例程2:

#!/bin/bash
#whileread2
while read LINE
do
echo $LINE
done < names.txt
#这样是合法的格式,通过在done后面放上 <names.txt 来重定向输入

类比格式:

#!/bin/bash
#whileread2
while read LINE < names.txt
do
echo $LINE
done
#这个格式将会无限循环只输出names.txt的第一行的内容

4.7.break控制
        格式:
            break [ n ]
            break 其实就是 break 1
        简介:
            退出循环
            如果是在一个嵌入循环中,可以指定n来跳出的循环的个数
        例程1:

#!/bin/bash
#breakout
while :
#while : 表示永远为真,注意while和: 之间一定要有一个空格,否则会有语法错误
do
echo -n "Enter any number[ 1...5 ]:"
read ANS
case $ANS in
1|2|3|4|5)
echo "You enter a number between 1 and 5."
;;
*)
echo "Wrong bumber, Bye."
break
#break 用于跳出while循环,而不是用于跳出case,这里不同于C等语言
;;
esac
done

4.8.continue控制
        简介:
            跳出循环步
            continue不同于break,continue不会跳出整个循环,而只是跳出这个循环中的某一步而已
        例程1:

#!/bin/bash
#continue
while:
do
echo -n "Enter any number [ 1...5 ]:"
read ANS
case $ANS in
1|2|3|4|5)
echo "You enter a number between 1 and 5"
;;
*)
echo -n "Wrong number, continue(y/n)?:"
read IS_CONTINUE
case $IS_CONTINUE in
y|yes|Y|YES
continue
;;
*)
break
;;
esac
esac
done

Shell编程基础教程4--控制流结构的更多相关文章

  1. Shell编程基础教程6--shell函数

    6.shell函数    6.1.定义函数        简介:            shell允许将一组命令集或语句形成一个可用块,这些块成为shell函数        定义函数的格式      ...

  2. Shell编程基础教程5--文本过滤、正则表达式、相关命令

    5.文本过滤.正则表达式.相关命令    5.1.正则表达式(什么是正则表达式?正则表达式怎么进行匹配?常用命令)        简介:            一种用来描述文本模式的特殊语法      ...

  3. Shell编程基础教程3--Shell输入与输出

    3.Shell输入与输出    3.1.echo        echo命令可以显示文本行或变量,或者把字符串输出到文件        echo [option] string             ...

  4. Shell编程基础教程2--变量和运算符

    2.变量和运算符 2.1.变量的类型 本地变量:环境变量:变量替换(显示变量):位置变量:标准变量:特殊变量: 2.2.本地变量 本地变量在用户现在的shell生命周期的脚本中使用 在命令行, LOC ...

  5. Shell编程基础教程1--Shell简介

    1.Shell简介 1.1.查看你系统shell信息 cat /etc/shell 命令可以获取Linux系统里面有多少种shell程序 echo $SHELL 命令可以查看当前你所使用的shell是 ...

  6. Shell编程基础教程7--脚本参数的传递

    7.脚本参数的传递    7.1.shift命令        简介:            shift n        每次将参数位置向左偏移n位        例子 #!/bin/bash us ...

  7. Shell 编程基础之基本语法结构汇总

    一.条件语句 简单条件 if [ condition ]; then # 当 condition 成立时,执行内容: fi # 将 if 反过来写,fi 结束 if 之意 复杂条件 if [ cond ...

  8. (转)Windows驱动编程基础教程

    版权声明     本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括 ...

  9. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

随机推荐

  1. Linux系统运行级别

  2. OpenCv haar+SVM训练的xml检测人头位置

    注意:opencv-2.4.10 #include "stdio.h"#include "string.h"#include "iostream&qu ...

  3. BZOJ 1014: [JSOI2008]火星人prefix

    Sol Splay+Hash+二分答案. 用Splay维护Hash,二分答案判断. 复杂度 \(O(nlog^2n)\) PS:这题调了两个晚上因为没开long long.许久不写数据结构题感觉写完整 ...

  4. Selenium Webdriver元素定位的常用方式

    单选框.复选框.文本框和密码框的元素标签都是input,此时单靠tagName无法准确地得到我们想要的元素,需要结合type属性才能过滤出我们要的元素.示例代码如下: public class Sea ...

  5. 5.6---交换整数的奇数位和偶数位(CC150)

    这道题要利用101010来&. 如下答案: public class Exchange { public int exchangeOddEven(int x) { // write code ...

  6. HTML 返回顶部的样式

    .fhdb{ width:50px; height:50px; position:fixed;   //可以用来定义元素的固定定位. right:20px;      //距离右侧20像素 botto ...

  7. java 调用webservice的各种方法总结

    java 调用webservice的各种方法总结 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 方法一:创建基于JAX-WS的webservice(包括 ...

  8. 如何用 Robotframework 来编写优秀的测试用例

    介绍 这篇文档将会是一篇在「高层面」的怎么用 Robotframework 来编写优秀测试用例的原则.至于如何使用 Robotframework 来与您的待测试系统相作用这样的细节讨论是不包含在这篇文 ...

  9. c++ macro

     C++ Code  12345678910111213141516171819202122232425262728293031   /* version: 1.0 author: hellogise ...

  10. bootstrap 重写JS的alert、comfirm函数

    原理是使用bootstrap的Modal插件实现. 一.在前端模板合适的地方,加入Modal展现div元素. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...