bash编程之条件判断
每个完整并且合理的程序语言都具有条件判断的功能,并且可以根据条判断的结果做下一步处理,bash有:
if/then结构:用来判断命令列表的退出状态码是否为0
条件测试的表达式
[ expression ]:”[“同test是一个内建命令,它把参数作为比较表达式,或者文件测试
[[ expression ]]:”[[“是一个关键字
test expression
整数判断
在[ ]中使用
-eq 相等 if [ “$a” –eq “$b” ]
-ne 不相等 if [ “$a” –ne “$b” ]
-ge 大于等于 if [ “$a” –ge “$b” ]
-gt 大于 if [ “$a” –gt “$b” ]
-le 小于等于 if [ “$a” –le “$b” ]
-lt 小于 if [ “$a” –lt “$b” ]
字符串测试
= 相等 if [ “$a” = “$b” ]
== 相等 if [ “$a” == “$b” ]
!= if [ “$a” != “$b” ]
< if [ “$a” \< “$b” ] if [[ “$a” < “$b” ]]
> if [ “$a” \> “$b” ] if [[ “$a” > “$b” ]]
-z 字符串为“null”,意思就是字符串长度为零
-n 字符串不为“null”测试空字符串最好用[ "x$string" != x -o "x$a" ="x$b" ]
文件测试
shell 文件状态测试
-b filename : 当filename 存在并且是块文件时返回真(返回0)
-c filename : 当filename 存在并且是字符文件时返回真
-d pathname : 当pathname 存在并且是一个目录时返回真
-e pathname : 当由pathname 指定的文件或目录存在时返回真
-f filename : 当filename 存在并且是正规文件时返回真
-g pathname : 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
-h filename : 当filename 存在并且是符号链接文件时返回真 (或 -L filename)
-k pathname : 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
-p filename : 当filename 存在并且是命名管道时返回真
-r pathname : 当由pathname 指定的文件或目录存在并且可读时返回真
-s filename : 当filename 存在并且文件大小大于0 时返回真
-S filename : 当filename 存在并且是socket 时返回真
-t fd : 当fd 是与终端设备相关联的文件描述符时返回真
-u pathname : 当由pathname 指定的文件或目录存在并且设置了SUID 位时返回真
-w pathname : 当由pathname 指定的文件或目录存在并且可写时返回真
-x pathname : 当由pathname 指定的文件或目录存在并且可执行时返回真
-O pathname : 当由pathname 存在并且你是文件的拥有者返回真(字母O 大写)
-G pathname : 当由pathname 存在并且文件的group id和你相同时返回真
file1 -nt file2 : file1 比file2 新时返回真
file1 -ot file2 : file1 比file2 旧时返回真
file1 –et file2:file1和file2是相同文件的硬链接
举例: if [ -b /dev/hda ] ;then echo "yes" ;else echo "no";fi // 将打印 yes
test -c /dev/hda ; echo $? // 将打印 1 表示test 命令的返回值为1,/dev/hda 不是字符设备
[ -w /etc/passwd ]; echo $? // 查看对当前用户而言,passwd 文件是否可写
测试时逻辑操作符-a 逻辑与,操作符两边均为真,结果为真,否则为假。-o 逻辑或,操作符两边一边为真,结果为真,否则为假。! 逻辑否,条件为假,结果为真
命令间的逻辑关系
逻辑与:&&
第一个条件为假时,第二个条件不用再判断,最终结果已经有
第一条件为真时,第二个条件必须得判断
逻辑或:||
条件判断控制结构
单分支if语句
if 判断条件;then
statement1
statement2
...
fi
双分支的if语句:
if 判断条件;then
statement1
statement2
....
else
statement3
statement4
....
fi
if 判断条件1;then
statement1
....
elif 条件判断2;then
statement2
....
elif 条件判断3;then
statement3
....
else
statement4
....
fi
If命令能够测试任何命令, ”if COMMAND”结构将会返回COMMAND的退出状态码
练习以下例题
练习:
写一个脚本完成以下要求:
1.添加3个用户user1,user2,user3:但先要判断用户是否存在,不存在而后再添加。
2.添加完成后显示一共添加了几个用户,(不包括因为事先存在而没有添加的)
3.最后显示系统上当前一共有多少用户
写一个脚本完成以下要求:
给定一个用户,如果其UID为0,就显示此为管理员;否则就显示为普通用户
写一个脚本,完成以下任务:
1.使用一个变量保存用户名
2.删除此变量中的用户且一并删除其家目录
3.显示“用户删除完成”类的信息
#!/bin/bash
if grep 'bash$' /etc/passwd &>/dev/null; then
echo "There is `grep 'bash$' /etc/passwd|wc -l|cut -d' ' -f1` users use bash."
else
echo " There is none user use the bash."
fi
#!/bin/bash
FILE=/ect/inittab
if [ ! -e $FILE ]; then
echo "NO $FILE."
exit 8
fi
if grep '^$' $FILE; then
echo "there are `grep '^$' $FILE | wc -l|cut -d' ' -f1` lines space l
ine."
else
echo " No blank line."
fi
写一个脚本,给定一个文件:
如果是一个普通文件就显示之
如果是一个目录亦显示之
否则此为无法识别之文件。
#!/bin/bash
#
read -p "please input a file:" FILENAME
if [ ! -e $FILENAME ];then
echo "NO such file."
exit 8
fi
if [ -f $FILENAME ]; then
echo "$FILENAME is a simple file."
elif [ -d $FILENAME ]; then
echo "$FILENAME is a directory."
else
echo "$FILENAME is a WUFASHIBIE file."
fi