Linux shell程序设计(六).控制结构-1
开始进入变成的实质性部分——语句结构。其中的if语句的复杂度超过了我的想象,特别是那几个不同的种类,需要好好研究研究。
一、if语句
1、
测试语句条件
if 测试语句
then 命令1
else 命令2
fi
举例:
if test -f "$1"
then pr $1
elif test -d "$1"
then (cd $1 ; pr *)
else echo "$1 is neither a file nor a directory."
fi
说明:如果$1是一个普通文件名,则打印其内容,如果$1是一个文件夹地址,则打印其下所有文件的内容,如果均不是,则显示错误信息。
2、命令语句条件
通常if语句都用test命令测试,但是也可以利用一般命令执行成功与否来做判断。
如果执行成功,则返回0,if条件为真;否则为假。
if 命令表1
then 命令表2
else 命令表3
fi
举例:
if
grep $user /etc/passwd > /tmp/null
who | grep $user
then
echo "$user has logged in the system."
cp /tmp/null tmp1
rm /tmp/null
else
echo "$user has not logged in the system."
fi
说明:如果输入用户已经注册,则将信息写入tmp1中,若未注册则返回错误信息。
二、条件测试
条件测试有3中形式:
① 用test命令 --test -f "$1"
② 用[]括起来([]里面必须要有空格) --[ -f "$1"]
③ 用[[条件表达式]]的格式
test命令可以和多种系统运算符一起使用,主要包括以下几类:
1、文件类测试
① -r 文件名:文件存在且可读,则返回true
② -w 文件名:文件存在且可写,则返回true
③ -x 文件名:文件存在且可执行,则返回true
④ -f 文件名:文件存在且为普通文件,则返回true
⑤ -d 文件名:文件存在且为目录文件,则返回true
⑥ -p 文件名:文件存在且为命名的FIFO文件,则返回true
⑦ -b 文件名:文件存在且是块设备文件,则返回true
⑧ -c 文件名:文件存在且是字符设备文件,则返回true
⑨ -s 文件名:文件存在且长度大于0,则返回true
⑩ -t 描述字:若文件被打开且描述字与终端设备相关,则返回true(默认描述字为1)
2、字符串测试
① -z s1:若字符串s1长度为0,则返回true
② -n s1:若字符串s1长度大于0,则返回true
③ s1:若字符串s1存在且部位空,则返回true
④ s1 = s2:若s1、s2相等,则返回true(“=”可以用“==”代替,“=”前后必须有空格)
⑤ s1 != s2:若s1、s2不相等,则返回true
⑥ s1 < s2:若按字典顺序s1在s2之前,则返回true
⑦ s1 > s2:若按字典顺序s1在s2之画后,则返回true
3、数值测试
① n1 -eq n2:若n1等于n2,则返回true
② n1 -ne n2:若n1不等于n2,则返回true
③ n1 -lt n2:若n1小于n2,则返回true
④ n1 -le n2:若n1小于等于n2,则返回true
⑤ n1 -gt n2:若n1大于n2,则返回true
⑥ n1 -ge n2:若n1大于等于n2,则返回true
4、逻辑运算符
逻辑运算符是用于将以上测试语句组合起来的符号
① !:逻辑非,放在表达式的最前面,使表达式最终结果相反。
② -a:逻辑与,放在两个表达式之间 &&
③ -o:逻辑或,放在两个表达式之间 ||
④ ():用于划分逻辑运算
举例:
[ ! -r $1 ]
!test -r "$1"
[ -f "$myfile" -a -r "$myfile" ]
[ "$a" -ge 0 -o "$b" -le 100 ]
[ \( "$a" -ge 0 -o "$b" -le 100 \) -a "$c" -eq 10 ]
优先级:
表达式 > () > ! > -a > -o
5、特殊条件测试
① “:”:表示不做任何事情,退出值为0
② true:表示总为真,退出值为0
③ false:表示总为假,退出值为255
举例:
echo "Enter two numbers"
read x y
((z=x+y))
if [[ z -gt 10 ]]
then
echo "x+y>10"
fi
((x*=y))
((z%=5))
if [[ x -le 100 || z -ne 0 ]]
then
echo "x*y<=100 or (x+y)%5!=0"
fi
echo "Your current directory is `pwd`"
echo "Enter a file name ->\c"
read name
if [[ -r $name && -f $name ]]
then
cat $name
elif [[ -d $name && -x $name ]]
then
cd $name
ls -l | wc -l
else
echo "Bad file name!"
fi
三、case语句
语法格式为:
case 字符串 in
s1) 命令
...
命令;;
s2) 命令
...
命令;;
s3) 命令
...
命令;;
esac
举例如下:
echo "Please chose either a,b or c"
echo "[a] print a file"
echo "[b] delete a file"
echo "[c] quit"
read response
case $response in
a) lp myfile;;
b) rm myfile;;
c) echo "Good bye";;
esac
注意事项:
① 一个case可以跟多条命令,最后一个命令必须以“;;”结尾
② 模式字符串可以使用通配符,例如“*)”
③ 如果几个case相同处理,则用“|”隔开,表示“或”的意思
④ 各个case之间不能重复,且需要考虑先后位置
⑤ 以case关键字开头,以esac关键字结尾
⑥ case的退出值是最后一个命令执行的退出值,如未执行任何命令,则退出值为0