3.Linux Shell流程控制 1.if/else结构 2.条件 3.退出状态的逻辑操作 4.条件测试 5.case语句 6.循环控制 7.循环实例:命令行参数的处理

if condition
then
    statements
elif condition
then
    statements
else
    statements
fi

2.条件

与C语言不同的是,条件(condition)实际上是语句列表,而不是一般的布尔表达式。

按照惯例,函数以及命令的退出状态用0表示成功,非0表示失败。当退出状态遭遇if/else时,我们就能检验条件(condition)的执行结果,并根据执行结果进行相应处理。可以写出下面的伪代码:

if command #运行成功
then
    #欢呼吧
else
    #一定是哪里有问题
fi

3.退出状态的逻辑操作

Shell语法的神奇之处在于,它允许你在逻辑上操作退出状态。常见的逻辑操作有NOT,AND与OR。

1.NOT,使用!

if ! condition        # 条件判定失败
then
    statements
fi

2.AND,使用&&

if condition1 && condition2        #首先执行第一个条件判断,如果成功再执行第二个,如果第二个也成功,则整个条件判断成功
then
    statements
fi

3.OR,使用||

if condition1 || condition2        #只要有一个条件成功,整个条件判断就成功
then
    statements
fi

4.条件测试

if语句唯一可以测试的内容是退出状态,不能用于检测表达式的值。但是通过test命令,你可以将表达式值的测试与if语句连用。

test命令介绍:

  1.使用方式:

  test Expression 或 [ Expression ]。用中括号做判断是,"["后和"]"前的空格是必须加的。

  2.描述:

  test命令平菇Expression参数,如果表达式值为True,test命令返回一个0退出值。否则,test命令返回一个非0退出值。如果没有参数,test命令也返回一个非0退出值。

4.1.字符串比较

操作符 含义
str1 = str2   str1匹配str2
str1 != str2 str1不匹配str2
str1 < str2 str1小于str2
str1 > str2 str1大于str2
-n str1 str1为非null(长度大于0)
-z str1 str1为null(长度为0)

4.2文件属性检查

操作符 含义
-b file   file为块设备文件
-c file file为字符设备文件
-d file file为目录
-e file file存在
-f file file为一般文件
-g file file有设置它的setgid位
-h file file为符号连接
-L file 同-h
-p file file为管道
-r file file可读
-S file file为套接字
-s file file非空
-u file file有设置它的setuid位
-w file file可写
-x file file可执行,如果是目录,则file可被查找
-O file 你是file的所有者
-G file file的组ID匹配你的ID
file1 -nt file2 file1比file2新
file1 -ot file2 file1比file2旧

5.case语句

语法如下:

case expression in
pattern1)
    statements;;
pattern2)
    statements;;
pattern3)
    statements;;
...
esac

模式匹配按照顺序依次执行,直到匹配上为止。

6.循环控制

for循环

for name [in list]        #遍历list中的所有对象
do
...
end

while循环

while condition
do
    statements
done

until循环

until condition    #当condition满足条件时,退出循环
do
    statements
done

跳出循环 break

下一轮循环 continue

7.循环实例:命令行参数的处理

author=false
list=false
file=""

while [ $# -gt 0 ]
do
case $1 in
-f)  file=$2
    shift
    ;;
-l)  list=true
    ;;
-a)  author=true
    ;;
--)  shift          #传统上,以--结束选项
    break
    ;;
-*)  echo $0: $1: unrecognized option
    ;;
*)  break
    ;;
esac
shift
done

在shell中,有getopt命令,可以简化处理:

author=false
list=false
file=""

while getopt alf: opt    #alf表示要处理-a -l -f,opt用于存储参数标志
do
case $opt in
f) file=$OPTARG    #参数放在OPTARG变量中
    ;;
l) list=true
    ;;
a) author=true
    ;;    
esac
done