流程控制语句 - 顺序、选择
顺序执行
命令1 && 命令2:命令1执行成功,命令2才会执行
$ mv /apps/bin /apps/dev/bin && rm -r /apps/bin #如果移动成功,参会删除。否则,删除语句不会执行
命令1 || 命令2:命令1执行失败,命令2才会执行
$ comet month_end.txt || exit
如果脚本comet执行成功,就退出
(命令1;命令2;. . .)
括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
{ 命令1;命令2;...;命令n;}
代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。
选择语句
1. 基本语句
if condition_statament
then
statament
fi
其中condition_statament执行后的状态是判断的依据,返回0表示执行成功,否则表示执行失败。通常由test语句的返回值给出。当然也可使用其他命令语句,执行成功则进入if内,否则跳过。(注意,符号“[”在bash中就是test命令,新版本中才强制使用“]”做结束)
# 最原始的使用test,后改用 [] if test 1 = 1 then echo 原始的 fi # 或者可以通过;分割语句在一行执行【if [ 1 = $num ];then】 if [ 1 = $num ] then echo num\'s value is 1 elif [ 2 = $num ] then echo num\'s value is 2 else echo false fi
也可以在condition_statement中使用其他语句,比如这里ls命令执行失败,就跳过if语句了。
if ls a;then echo echo fi
2. 逻辑运算
逻辑运算有两种方式:
a) test命令内部的逻辑运算,其中[]之间就相当于test命令的简写
使用-a、-o,分别表示and和or。
使用!,表示not
b) test命令之间的逻辑运算
使用&&、||,分别表示and和or。
注意“[[”是bash中的关键字,而不是test的命令。
# 用||、&& if [[ 1 = 1 || 1 = 2 ]] then echo 或1 fi if [ 1 = 1 ] || [ 1 = 2 ] then echo 或2 fi # 用-a、-o if [ 1 = 1 -o 2 = 2 ] then echo 且 fi # 非用! if [ ! 1 = 2 ] then echo 非 fi
3. 分支语句
分支语句使用如下:
read ff case $ff in 1) echo select 1 ;; yes|y) echo select yes ;; 123*123) echo select 123*123 ;; *) echo select any ;; esac
4. 常用的判断条件(test命令中使用的)
关系运算
运算符号 | 代表意义 |
= | 等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串 |
!= | 不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串 |
< | 小于 应用于:整型比较 在[] 中,不能使用 表示字符串 |
> | 大于 应用于:整型比较 在[] 中,不能使用 表示字符串 |
-eq | 等于 应用于:整型比较 |
-ne | 不等于 应用于:整型比较 |
-lt | 小于 应用于:整型比较 |
-gt | 大于 应用于:整型比较 |
-le | 小于或等于 应用于:整型比较 |
-ge | 大于或等于 应用于:整型比较 |
-a | 双方都成立(and) 逻辑表达式 –a 逻辑表达式 |
-o | 单方成立(or) 逻辑表达式 –o 逻辑表达式 |
-z | 空字符串 |
-n | 非空字符串 |
文件与文件夹判断
逻辑卷标 | 表示意思 |
1 | 关于文件与文件夹的检测逻辑卷标! |
-f | 常用!检测『文件』是否存在 eg: if [ -f filename ] |
-d | 常用!检测『文件夹』是否存在 |
-b | 检测是否为一个『 block 文件』 |
-c | 检测是否为一个『 character 文件』 |
-S | 检测是否为一个『 socket 标签文件』 |
-L | 检测是否为一个『 symbolic link 的文件』 |
-e | 检测『某个东西』是否存在! |
2. | 关于程序的逻辑卷标! |
-G | 检测是否由 GID 所执行的程序所拥有 |
-O | 检测是否由 UID 所执行的程序所拥有 |
-p | 检测是否为程序间传送信息的 name pipe 或是 FIFO (老实说,这个不太懂!) |
3. | 关于文件的属性检测! |
-r | 检测是否为可读的属性 |
-w | 检测是否为可以写入的属性 |
-x | 检测是否为可执行的属性 |
-s | 检测是否为『非空白文件』 |
-u | 检测是否具有『 SUID 』的属性 |
-g | 检测是否具有『 SGID 』的属性 |
-k | 检测是否具有『 sticky bit 』的属性 |
4. | 两个文件之间的判断与比较 ;例如[ test file1 -nt file2 ] |
-nt | 第一个文件比第二个文件新 |
-ot | 第一个文件比第二个文件旧 |
-ef | 第一个文件与第二个文件为同一个文件( link 之类的文件) |
5. | 逻辑的『和(and)』『或(or)』 |
&& | 逻辑的 AND 的意思 |
|| | 逻辑的 OR 的意思 |