shell学习笔记之六(测试和判断)
测试和判断
测试
利用命令执行后的$?来判断命令是否执行正常。$?==0 ? 正常:错误
测试结构:
1、test expression
2、[ expression ] #注意表达式两侧的空格
方式2增加了代码的可读性,且更容易与if,case,while这些条件判断的关键字联用。
文件测试:
1、test file_operator FILE
2、[ file_operator FILE ]
例:
test -e /var/log/message
echo $? #文件存在返回0,不存在返回非0值
[ -e /var/log/message ]
echo $?
文件比较符
-b 文件存在且是块文件
-c 文件存在且是字符设备
-e 文件或目录是否存在
-d 文件存在且是目录
-f 文件存在且是普通文件
-x 文件存在且是可执行文件
-w 文件存在且为可写文件
-r 文件存在且为可读文件
-l 文件存在且为连接文件
-p ...管道文件
-S ...socket文件
-s 大小不为0
FILE1 nt FILE2 FILE1比FILE2新返回真
FILE1 ot FILE2 FILE1比FILE2旧返回真
例:测试文件的读,写,执行属性
#!/bin/bash
read -p "input a filename which you want to test:" filename
if [ ! -e "$filename" ];then
echo "The file doesn‘t exist."
exit 1
fi
if [ -w "$filename" ];then
echo "The file is writeable."
fi
if [ -r "$filename" ];then
echo "The file is readable."
fi
if [ -x "$filename" ];then
echo "The file is executable"
fi
注意:
if [ expression ] 中if和[]之间要有空格
字符串测试:
字符串比较(字典序)主要有大于,小于,等于,不等于,空,不空
> < = != -z -n
例:
str=""
test -z "$str"
echo $? #0
test -n "$str"
echo $? #1
test -n $str
echo $? #0,最好加上双引号("")
str="hello"
[ -z "$str" ]
echo $? #1
[ -n "$str" ]
echo $? #0
str1="123"
str2="234"
[ "$str1" = "$str2"] #test $str1 = $str2,注意空格,否则一直返回0
echo $? #1
[ "$str1" != "$str2" ]
echo $?
[ "$str1" \> "$str2" ]
echo $?
[ "$str1" \< "$str2" ]
echo $?
[[ "$str1" > "$str2" ]] #不使用转义字符
echo $?
整数比较
-eq =
-lt <
-gt >
-le <=
-ge >=
-ne !=
1、test num1 num_operator num2
2、[ num1 num_operator num2 ]
例:
num1=10
num2=10
num3=9
num4=11
#测试相等
[ $num1 -eq $num2]
echo $?
test $num3 -eq $num2
echo $?
注意:一定要注意空格,否则得到的有可能错误
逻辑测试符和逻辑运算符
逻辑与,逻辑或,逻辑非
-a -o !
非:!expression
与:expression1 -a expression2
或:expression1 -o expression2
&& || !
[ -e /var/log/message ] && [ -e /var/log/message01 ]
=[ -e /var/log/message -a -e /var/log/message01 ]
[ -e /var/log/message ] || [ -e /var/log/message01 ]
=[ -e /var/log/message -o -e /var/log/message01 ]
注意两种不同的写法
判断
if语句
if expression;then
command1
command2
...
fi
例:判断学生成绩
#!/bin/bash
echo -n "input a score of a student:" #-n的意思是不换行
read score
if [ $score -lt 60 ];then
echo "D"
fi
if [ $score -lt 80 -a $score -ge 60 ];then
echo "C"
fi
if [ $score -lt 90 -a $score -ge 80 ];then
echo "B"
fi
if [ $score -le 100 -a $score -ge 90 ];then
echo "A"
fi
if [ $score -gt 100 ];then
echo "the number is invalid"
fi
学过高级语言之后,其实就是学习shell的语法和编程特色,高级语言注重于大型项目,而shell注重于工作的便利,让工作自动化
if/else语句
if expression ;then
command
else
command
fi
例:判断一个文件是否存在
#!/bin/bash
echo -n "input a filename:"
read filename
if [ -e $filename ];then
echo "file exists."
else
echo "file doesn‘t exists."
fi
if/elif/else
多重的if/else语句
例:修改学生成绩脚本
#!/bin/bash
echo -n "input a score of a student:"
read score
if [ $score -lt 60 ];then
echo "D"
elif [ $score -lt 80 ];then
echo "C"
elif [ $score -lt 90 ];then
echo "B"
elif [ $score -le 100 ];then
echo "A"
elif [ $score -gt 100 ];then
echo "the number is invalid"
fi
case
相当于switch...case
结构:
case VAR in
var1) command ;;
var2) command ;;
var3) command ;;
...
*) command ;;
注意:case的var1、var2、var3等这些值只能是常量或正则表达式,还能是正则啊,不错
例:检测当前系统的类型
#!/bin/bash
type=`uname -s` #print the kernel name
case $type in
L*)
echo "Linux"
;;
SunOS)
echo "SunOS"
;;
Darwin)
echo "Darwin"
;;
*)
echo "other"
;;
esac
检测用户输入中是否含有大写字母,小写字母或者数字
#!/bin/bash
echo -n "Input a string: "
read str
case $str in
*[[:lower:]]*)
echo "The string contains lower letters."
;;
*[[:upper:]]*)
echo "The string contains upper letters."
;;
*[[:digit:]]*)
echo "The string contains digit."
;;
*)
echo "other"
;;
esac
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。