Shell入门教程:流程控制(1)命令的结束状态
在Bash Shell中,流程控制命令有2大类:“条件”、“循环”。属于“条件”的有:if、case;属于“循环”的有:for、while、until;命令 select 既属于“条件”,也属于“循环”。不管是哪一种,均需进行条件测试,再根据测试结果,决定程序流程进行的方向。
以下逐一说明这些命令的用法。
第一节:命令的结束状态
Bash Shell Script 可由许多命令组成。每一个命令执行后,都会传回一个结束状态值,如果执行成功,传回0,如果执行失败,则传回非0值。执行失败,也分成许多状况,例如:
某个命令执行失败,产生严重的信号n,则其结束状态传回值为 128+n。如果执行命令时,发现该命令不存在,则传回值为 127。命令存在但没有执行权,则传回值 126.
Bash的内置变量 $?,用来存储每个命令执行后传回的状态值。如下述举例,执行test.sh时,Bash在搜寻路径中找不到这个Script,结束状态变量 $? 的值为 127;执行 ./test.sh时,由于Script没有执行权,$? 的值为 126。
[root@localhost ~]# test.sh -bash: test.sh: 没有那个文件或目录 [root@localhost ~]# echo $? 127 [root@localhost ~]# ./test.sh -bash: ./test.sh: 权限不够 [root@localhost ~]# echo $? 126 [root@localhost ~]#
在Bash的流程控制中,需进行条件测试,就是以结束状态作为真假的判断依据:
如果结束状态为0,则判断为真;反之,如果结束状态为非0值,则判断为假。
第二节:if条件判断
先来看一个简单的例子:
if grep -q ^jianbao /etc/passwd; then echo 'jianbao这个账号存在' fi
#格式一
if 条件测试; then 命令区域 fi
#格式二
if 条件测试; then 命令区域1 else 命令区域2 fi
#格式三(完整语法)
if 条件测试1; then 命令区域1 elif 条件测试2; then 命令区域2 else 命令区域3 fi
举例一:
if [ -d /root/tmp ]; then echo '/root/tmp目录存在' else echo '/root/tmp目录不存在' fi
举例二:
#!/bin/bash # 数学的三一律 declare -i a b a=$1;b=$2 if ((a<b)); then echo "$a小于 $b" elif ((a>b)); then echo "$a大于 $b" else echo "$a等于 -$b" fi
(())是Bash的复合命令(Compound command),内置算术。((算术)) 可对算式的运算结果传回真假值:
如果算术的结果为非0,则结束状态传回0,表示该算式为真;如果算式的结果为0,则结束状态传回1,表示该算式为假。它的意义同于:
let "算术"
举例三:
#!/bin/bash # 数学的三一律 declare -i a b a=$1;b=$2 if let "a<b"; then echo "$a小于 $b" elif let "a>b"; then echo "$a大于 $b" else echo "$a等于 -$b" fi