目录
shell条件测试
一,条件测试的基本语法
1,test
2,[ ]
3,[[ ]]
二,文件测试表达式
1,判断目录是否存在:
2,判断文件file1是否有写的权限,结果为有
3,判断文件file1是否有执行的权限
三,逻辑运算符: &&(与), ||(或), !(非)
1,条件1(命令1) && 条件2(命令2) -》 条件1为假,条件2不执行
条件1为真,条件2执行
2,条件1(命令1) || 条件2(命令2) -》 条件1为真,条件2不执行
条件1为假,条件2执行
练习:
四,字符串测试表达式
五,整数测试表达式
六,逻辑操作符 (在里面使用)
1, [ ]
2,test
3,[[ ]]
实验1:
实验2:
shell条件测试
为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。通过 这些运算符,Shell程序能够判断某种或者几个条件是否成立。条件测试在各种流程控制语句,例如判断 语句和循环语句中发挥了重要的作用,所以,了解和掌握这些条件测试是非常重要的。
一,条件测试的基本语法
在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假。当指定的条件为 真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。 (shell中真0,假非0)
1,test
[root@wangjingjing 0131]# touch file1
[root@wangjingjing 0131]# test -a file1
[root@wangjingjing 0131]# echo $?
0
[root@wangjingjing 0131]# [ -a file1 ]
[root@wangjingjing 0131]# echo $?
0
2,[ ]
[root@wangjingjing 0131]# [ -a file2 ]
[root@wangjingjing 0131]# echo $?
1
3,[[ ]]
[root@wangjingjing 0131]# [[ -a file1 ]]
[root@wangjingjing 0131]# echo $?
0
二,文件测试表达式
如何在一行上执行两个命令
命令1 && 命令2
命令1;命令2
小练习:
[root@wangjingjing ~]# cd shell_code23/
[root@wangjingjing shell_code23]# mkdir 0131
[root@wangjingjing shell_code23]# cd 0131
[root@wangjingjing 0131]# ls
[root@wangjingjing 0131]# test -a file1
[root@wangjingjing 0131]# echo $?
1
[root@wangjingjing 0131]#
1,判断目录是否存在:
[root@wangjingjing 0131]# test -d dir1
[root@wangjingjing 0131]# echo $?
1
创建文件dir1,判断dir1是否为目录,结果为否
[root@wangjingjing 0131]# touch dir1
[root@wangjingjing 0131]# test -d dir1
[root@wangjingjing 0131]# echo $?
1
创建目录dir1后再去判断dir1是否为目录,结果为是
[root@wangjingjing 0131]# mkdir dir1
[root@wangjingjing 0131]# test -d dir1
[root@wangjingjing 0131]# echo $?
0
2,判断文件file1是否有写的权限,结果为有
[root@wangjingjing 0131]# [ -w file1 ]
[root@wangjingjing 0131]# echo $?
0
3,判断文件file1是否有执行的权限
[root@wangjingjing 0131]# [ -x file1 ]
[root@wangjingjing 0131]# echo $?
1
也可以用;把两条命令隔开
[root@wangjingjing 0131]# [ -x file1 ]; echo $?
1
注意:如果测试的文件路径是用变量来代替,变量一定要加引号
三,逻辑运算符: &&(与), ||(或), !(非)
1,条件1(命令1) && 条件2(命令2) -》 条件1为假,条件2不执行
条件1为真,条件2执行
&&:如果条件1为假,条件2不执行
[root@wangjingjing 0131]# test -e file3 && ls -l
[root@wangjingjing 0131]# test -e file1 && ls -l
2,条件1(命令1) || 条件2(命令2) -》 条件1为真,条件2不执行
条件1为假,条件2执行
||:如果条件1为真,条件2不执行
[root@wangjingjing 0131]# test -e file3 || ls -l
如果第一个条件就可以决定当前的整个条件表达式的真假,那么后面的就不执行了
练习:
让用户输入一个文件名,并做如下判断
(1)如果用户输入的文件为空时显示:you must input a filename,并中断程序。
(2)如果用户输入的文件不存在时,显示the file do not exist,并中断程序
(3) 如果文件存在,判断该文件类型和执行者对改文件所拥有的权限。
1,打开文件file_stst.sh
[root@wangjingjing 0131]# vim file_test.sh
2,编辑保存并退出
#用户输入一个文件名(路径+文件名)
read -p "please input a filename: " filename
#文件名为空时,输出you must input a filename,并退出,状态码为111
test -z "$filename" && echo "you must input a filename" && exit 111
#如文件不存在时,显示the file do not exist,并中断程序,状态码222
test ! -e "$filename" && echo "the file $filename do not exist" && exit 222
#如果文件存在,判断该文件类型和执行者对改文件所拥有的权限。
#普通文件输出regulare file
[ -f "$filename" ] && echo "regulare file"
#目录文件输出directory
[ -d "$filename" ] && echo "directory"
#可读reable
[[ -r "$filename" ]] && echo "radable"
#可写writable
[[ -w "$filename" ]] && echo "writable"
#可执行executable
[[ -x "$filename" ]] && echo "executable"
3,重新加载文件,测试
[root@wangjingjing 0131]# bash file_test.sh
please input a filename:
you must input a filename
[root@wangjingjing 0131]# echo $?
111
[root@wangjingjing 0131]# bash file_test.sh
please input a filename: file 3
the file file 3 do not exist
[root@wangjingjing 0131]# bash file_test.sh
please input a filename: file1
regulare file
radable
writable
四,字符串测试表达式
test -n "" && echo true || echo false
若第一个条件为真 echo true
若第一个条件为假 echo false
字符串比较,比ascii码,从第一个字符开始比较
五,整数测试表达式
注意:
=和!=也可在[]中作比较时使用,在[]中也可使用>和<符号,但需要使用反斜线转义,有时不转译虽然语
法不会报错,但是结果可能会不对;
在[[]]中也可使用包含-gt和-lt的符号,不建议使用;
比较符号两端也要有空格。
[]以及test中使用的比较符号 用字母
在(())只能比较整数和[[]]中使用的比较符号 用符号
[],test整数比较用字母,字符串比较用符号
数字的比较:[],test
字符串的比较 [],test,[[]],
字符串比较用符号:
test:
[root@wangjingjing 0131]# test 5 > 44 && echo true || echo false
true
[ ]:
[root@wangjingjing 0131]# [ 5 > 44 ] && echo true || echo false
true
数字比较用字母:
test:
[root@wangjingjing 0131]# test 5 -gt 44 && echo true || echo false
false
[ ]:
[root@wangjingjing 0131]# [ 5 -gt 44 ] && echo true || echo false
false
test 比较字符串与test比较数字:
[root@wangjingjing 0131]# test 2 \< 3 && echo true || echo false
true
[root@wangjingjing 0131]# test 2 -lt 3 && echo true || echo false
true
[root@wangjingjing 0131]# test 2 -gt 3 && echo true || echo false
false
[root@wangjingjing 0131]# test 2 \> 3 && echo true || echo false
false
[ ]比较字符串和[ ]比较数字
[root@wangjingjing 0131]# [ 2 \> 3 ] && echo true || echo false
false
[root@wangjingjing 0131]# [ 2 -gt 3 ] && echo true || echo false
false
[[ ]]比较字符串和(()) 比较字符串
[root@wangjingjing 0131]# [[ 2 < 3 ]] && echo true || echo false
true
[root@wangjingjing 0131]# (( 2 < 3 )) && echo true || echo false
true
(( ))只能比较整数数字
[root@wangjingjing 0131]# (( abc < abd )) && echo true || echo false
false
[root@wangjingjing 0131]# [[ abc < abd ]] && echo true || echo false
true
六,逻辑操作符 (在里面使用)
在[]中使用的逻辑操作符 用字母
在test、[[]]和(())中使用的逻辑操作符 用符号
1, [ ]
与:
[root@wangjingjing 0131]# [ 2 -lt 3 -a 3 -lt 4 ] && echo true || echo false
true
[root@wangjingjing 0131]# [ 2 -lt 3 -a 3 -gt 4 ] && echo true || echo false
false
或:
[root@wangjingjing 0131]# [ 2 -lt 3 -o 3 -gt 4 ] && echo true || echo false
true
[root@wangjingjing 0131]# [ 2 -gt 3 -o 3 -gt 4 ] && echo true || echo false
false
非:
[root@wangjingjing 0131]# [ ! 3 -gt 4 ] && echo true || echo false
true
2,test
[root@wangjingjing 0131]# test 3 -gt 2 && test 7 -gt 6 && echo true || echo false
true
3,[[ ]]
与
[root@wangjingjing 0131]# [[ 3 > 2 && 1 > 3 ]] && echo true || echo false
false
[root@wangjingjing 0131]# [[ 3 > 2 && 1 < 3 ]] && echo true || echo false
true
或
[root@wangjingjing 0131]# [[ 3 > 2 || 1 > 3 ]] && echo true || echo false
true
非
[root@wangjingjing 0131]# [[ ! 1 > 3 ]] && echo true || echo false
true
4,(( ))比较整数
与
[root@wangjingjing 0131]# ((3>4 && 1<2)) && echo true || echo false
false
或
[root@wangjingjing 0131]# ((3<4 || 1<2)) && echo true || echo false
true
非
[root@wangjingjing 0131]# ((! 3>4)) && echo true || echo false
false
[root@wangjingjing 0131]# ((! 4>3)) && echo true || echo false
false
实验1:
通过read传入一个数字,如果传入的数字等于1,就打印1;如果等于2,就打印2,如果不等于1 也不等于2,就提示输入不对,然后退出程序。
1,打开文件num_test.sh 编辑保存退出
[root@wangjingjing 0131]# vim num_test.sh
#输入
read -p "please input a number: " num
#输入的数字如果等于1,打印1,退出状态码为1
[ $num -eq 1 ] && {
echo 1
exit 1
}
#输入的数字如果等于2,打印2,退出状态码为2
[[ $num == 2 ]] && {
echo 2
exit 2
}
#输入的数字如果不等于1,也不等于2,输出input incorrect,退出状态码为3
test $num -ne 1 && test $num -ne 2 && {
echo "input incorrect"
exit 3
}
2,重新加载文件,验证
[root@wangjingjing 0131]# bash num_test.sh
please input a number: 1
1
[root@wangjingjing 0131]# bash num_test.sh
please input a number: 2
2
[root@wangjingjing 0131]# bash num_test.sh
please input a number: 3
input incorrect
[root@wangjingjing 0131]# bash num_test.sh
please input a number: 66
input incorrect
实验2:
通过read读入两个整数,并比较他们的大小
1,打开文件num_test2.sh编辑保存并退出
[root@wangjingjing 0131]# vim num_test2.sh
#判定输入的正确性:num1 和 num2 不为空;num1 和 num2 必须是整数
test -z "$num1" || test -z "$num2" && {
echo "please input two number"
exit 111
}
#判断是否是数字:expr
expr $num1 + 1 &> /dev/null
exit_code=$?
[ $exit_code -ne 0 ] && {
echo "num1 is not integer"
exit 222
}
expr $num2 + 1 &> /dev/null
exit_code=$?
[[ $exit_code != 0 ]] && {
echo "num2 is not integer"
exit 222
}
#如果num1<num2,打印num1<num2,退出状态码为0
[ $num1 -lt $num2 ] && {
echo "$num1 < $num2 "
exit 0
}
#如果num1>num2,打印num1>num2,退出状态码为0
test $num1 -gt $num2 && {
echo "$num1 > $num2"
exit 0
}
#如果num1=num2,打印num1=num2,退出状态码为0
[[ $num1 = $num2 ]] && {
echo "$num1 == $num2"
exit 0
}
2,重新加载文件,测试
(1)判定输入的正确性:num1 和 num2 不为空;num1 和 num2 必须是整数
[root@wangjingjing 0131]# bash num_test2.sh
please inpur two numbers: 1
please input two number
[root@wangjingjing 0131]# bash num_test2.sh
please inpur two numbers: 2
please input two number
[root@wangjingjing 0131]# bash num_test2.sh
please inpur two numbers: a
please input two number
(2)判断是否是数字:expr
[root@wangjingjing 0131]# bash num_test2.sh
please inpur two numbers: 1 c
num2 is not integer
[root@wangjingjing 0131]# bash num_test2.sh
please inpur two numbers: c 2
num1 is not integer
(3)如果num1<num2,打印num1<num2,退出状态码为0
[root@wangjingjing 0131]# bash num_test2.sh
please inpur two numbers: 1 5
1 < 5
[root@wangjingjing 0131]# echo $?
0
(4)如果num1>num2,打印num1>num2,退出状态码为0
[root@wangjingjing 0131]# bash num_test2.sh
please inpur two numbers: 7 3
7 > 3
[root@wangjingjing 0131]# echo $?
0
(5)如果num1=num2,打印num1=num2,退出状态码为0
[root@wangjingjing 0131]# bash num_test2.sh
please inpur two numbers: 6 6
6 == 6
[root@wangjingjing 0131]# echo $?
0