3.Linux Shell流程控制
1.if/else结构
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