在Bash Shell中,流程控制命令有两个类:“选择”和“循环”。属于“选择”的有:if,case;属于“循环”的有:for,while,until;命令select既属于“选择”,也属于“循环”。
一.简易的if语法:if-then-else
if ((2<10)); then
echo '真'
fi
结果为:真
也可以这样写:
if ((2<10)); then echo '真';fi
if-then-else
例子:
if [-d /root/tmp]; then
echo '/root/tmp目录存在'
else
echo '/root/tmp目录不存在'
fi
使用[]做条件测试,-d会检测这个/root/tmp是否存在,如果判断为真,就显示目录的存在的信息,如果为假,就会显示目录不存在的信息
if的完整语法
if 条件测试1; then
命令区域1
elif 条件测试2;then
命令区域2
else
命令区域3
fi
其中elif可以多行,数量不限,但else只能有一行。
条件测试的写法
1.执行某一个命令的结果
例子:
#! /bin/bash
if grep -q "rm" fn.sh; then
echo "find rm command"
else
echo "not find"
fi
在条件测试中,执行的命令是:grep -q "rm" fn.sh,它是寻找fn.sh文件里是否有关键词rm。
2.传回某一个命令执行结果的相反值
其形式为:!命令
注意,!和命令之间要有空格符
例子:#! /bin/bash
if ! grep -q "rm" fn.sh; then
echo "not find"
else
echo "find rm command"
fi
在条件测试中,执行的命令是:!grep -q "rm" fn.sh. !表示要传回相反的结果。
3.使用复合命令:((算式))
使用Bash关键词‘[[ ]]’组成的式子:[[ 判断式 ]]
注意:[[的后面、]]的前面,都至少要一个空格。
#! /bin/bash
if [[ str>xyz ]]; then
echo "字符串str比较大"
else
echo "字符串str比较小"
4.使用内置命令:test 判断式
test是bash的内置命令,可传回“判断式”的结果
#! /bin/bash
if test "str" \> "xyz"
echo "字符串str比较大"
else
echo "字符串str比较小"
fi
需特别注意的是:大于符号>对bash而言是特殊字符,要用\转义。
5.使用内置命令:[ ]
其形式为:[ 判断式 ]
[ ]和test用法相同
例子:
#! /bin/bash
if [ "str" \> "xyz" ]; then
echo "字符串str比较大"
else
echo "字符串str比较小"
fi
6.使用-a、-o进行逻辑组合
例子:
[ -r filename -a -x filename ]
如果filename可读且可执行,则为真。-a 即“且”之意。
[ -r filename -o -x filename ]
如果filename 可读或可执行,则为真。-o即“或”之意。
7.命令1 && 命令2
&&称为逻辑的AND,其运作的方式:如果“命令1”执行结果为真,才会执行“命令2”。
例如:
[ -z "$PS1" ] && return
先判断$PS1变量值是否为空,如果为空,就执行return命令,由子shell环境返回到父shell,这等于是结束执行该script。
例如:
[ -f /proc/net/if_inet6 ] && echo '这部主机支持IPv6'
判断/proc/net/if_inet6是否存在,如果存在,就显示支持IPv6协议。
往后,凡是“[ 判断式 ] && 指令”的形式,就视为一种隐性的if-then语法。
8.命令1 || 命令2
运作方式为:如果“命令1”执行为假,才会执行“命令2”
例如:
#! /bin/bash
a=200
if grep -q "rm" fn.sh || [ $a -lt 100 ] ; then
echo "OK"
else
echo "no OK"
fi
9.case的语法
case的语法结构如下:
case 待测项 in
样式串行 1 ) 命令区域1 ;;
样式串行2 ) 命令区域2 ;;
。。。。
*) 命令区域;;
esac
10. for循环
for循环的运作方式,是将串行的元素一一取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done之间),只到所有元素取尽为止。
for的语法结构如下:
for 变量 in 串行
do
命令区域
done
说明:将串行中的字段迭代放入变量中,接着重复执行do和done之间的命令区域。
用例1:
for i in 1 2 3 4 5
do
echo $i
done
11.while 循环
while 循环的语法:
while 条件测试
do
命令区域
done
范例:
#! /bin/bash
declare -i i=1
declare -i sum=0
while ((i<=10))
do
let sum+=i
let ++i
done
echo $sum
说明:先是声明i和sum为整数型;条件测试,只要i的值小于或等于10,就执行循环。sum+=i和sum=sum+i是一样的,sum累加上i。