shell 的条件表达式及逻辑操作符简单介绍

查看系统的shell:

cat /etc/shells

文件测试表达式:

  -f 文件  文件存在且为普通文件则真,即测试表达式成立。

  -d 文件  文件存在且为目录文件则真,即测试表达式成立。

  -s 文件  文件存在且文件大小不为0则真,即测试表达式成立。

  -e 文件  文件存在则真,即测试表达式成立。只要有文件就行,要区别 -f 。

  -r 文件  文件存在且可读则真,即测试表达式成立。

  -w 文件 文件存在且可写则真,即测试表达式成立。

  -x 文件  文件存在且可执行则真,即测试表达式成立。

  -L 文件   文件存在且为链接文件则真,即测试表达式成立。

  a –nt b    文件a比文件b新则真,即测试表达式成立,根据文件修改时间来计算

  a –nt b    文件a比文件b旧则真,即测试表达式成立,根据文件修改时间来计算

特别说明:这些操作符号对于[[]]、[]、test几乎是通用的,更多的操作符请man test查询。

普通文件测试表达式:

[root@lamp01 ~]# mkdir bqh1
[root@lamp01 ~]# ll -d ./bqh1
drwxr-xr-x. 2 root root 4096 1月  27 21:51 ./bqh1
[root@lamp01 ~]# [ -d bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -f bqh1.log ]&&echo 1||echo 0
0
[root@lamp01 ~]# touch ./bqh1.log
[root@lamp01 ~]# [ -f bqh1.log ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -e bqh1.log ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -e bqh2.log ]&&echo 1||echo 0
[root@lamp01 ~]# [ -r bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -w bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -x bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# chmod 000 bqh1
[root@lamp01 ~]# ll
d---------. 2 root root  4096 1月  27 21:51 bqh1
[root@lamp01 ~]# [ -x bqh1 ]&&echo 1||echo 0
1

提示:文件的读写执行等属性,不光是根据文件属性,而是当前执行脚本的用户根据测试选项是否真的可操作。

测试shell变量举例:

[root@lamp01 ~]# a=/etc/services
[root@lamp01 ~]# b=/etc/
[root@lamp01 ~]# [ -f $a ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -d $a ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -d $b ]&&echo 1||echo 0
1

特殊例子:如果变量不加双引号,测试结果可能不正确。

[root@lamp01 ~]# echo $c
[root@lamp01 ~]# [ -f "$c" ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -f $c ]&&echo 1||echo 0
1    #$c明明不存在的,却返回1

使用条件表达式时,多个返回值时,可以使用大括号的用法,格式如下:

当条件不成立就会执行大括号内的所有命令内容:

[root@lamp01 ~]# [ 1 -ne 1 ]||{ echo "my name is bqh" ; echo "my name is jyw" ;}
my name is bqh
my name is jyw
[root@lamp01 ~]# 

字符串测试表达式:

  字符串测试操作符:

  -z “字符串”               若串长度为0则真

  -n ”字符串“               若串长度不为0则真

  “字符串1”=“字符串2”     若串1等于串2则真,可以使用‘==’代替‘=’

  “字符串1”!=“字符串2”    若串1不等于串2则真,但不能用‘!==’代替‘!=’

测试如下:

[root@lamp01 ~]# [ -n "abc" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -n "" ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -z "" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -z "abc" ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ ! -z "abc" ]&&echo 1||echo 0
1
[root@lamp01 ~]# a="bqh"
[root@lamp01 ~]# [ -n "$a" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -z $a ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ ! -z $a ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ "$a" != "bqh1" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ "$a" = "bqh1" ]&&echo 1||echo 0
0

等号两端空格带来的问题:

[root@lamp01 ~]# [ "abc"="1" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ "abc" = "1" ]&&echo 1||echo 0
0

不加引号带来的问题:

[root@lamp01 ~]# a=""
[root@lamp01 ~]# [ $a = abc  ]&&echo 1||echo 0
-bash: [: =: unary operator expected
0
[root@lamp01 ~]# [ $a = "abc"  ]&&echo 1||echo 0
-bash: [: =: unary operator expected
0
[root@lamp01 ~]# [ "$a" = "abc"  ]&&echo 1||echo 0
0
[root@lamp01 ~]# 

特别注意:

1.比较符合两端有空格。

2.字符串测试操作符号务必要用“”引起来。

整数表达式:

  -eq:      ==或=                测试两个整数是否相等;比如 $A -eq $B

  -ne:       !=                 测试两个整数是否不等;不等,为真;相等,为假;

  -gt:        >                测试一个数是否大于另一个数;大于,为真;否则,为假;

  -lt:        <                测试一个数是否小于另一个数;小于,为真;否则,为假;

  -ge:        >=                 大于或等于

  -le:       <=                 小于或等于

在使用中中注意:

1、[]及test中使用字母模式。

2、在 (()) 和 [[]] 中使用符合模式。

提示:

“<”符号意思是小于,if[[ "$a" < "$b" ]],if [ "$a" \< "$b" ] 在单[]中需要转义,因为shell也用<和>重定向。

“>”符号意思是大于,if[[ "$a" > "$b" ]],if [ "$a" \> "$b" ] 在单[]中需要转义,因为shell也用<和>重定向。

“=”符号意思是等于,if[[ "$a" = "$b" ]],if [ "$a" = "$b" ] 在单[]中不需要转义。

测试:

[root@lamp01 ~]# [ 2>1 ] && echo 1 || echo 0
0  ==>这里的结果逻辑不对,条件应该成立,应该返回1
[root@lamp01 ~]# [ 2\>1 ] && echo 1 || echo 0
1 ==>转义后是正确的
[root@lamp01 ~]# [ 2 -eq 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 -gt 1 ] && echo 1 || echo 0
1
[root@lamp01 ~]# [ 2 -lt 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 -ge 1 ] && echo 1 || echo 0
1
[root@lamp01 ~]# [ 2 -le 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 = 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 = 2 ] && echo 1 || echo 0
1
[root@lamp01 ~]# [ 2 != 2 ] && echo 1 || echo 0
0

“=” 和 “!=” 在[]中使用不需要转义,包含“>”和“<”的符号在[]中使用需要转义,对于数字不转义的结果未必会报错,但是结果可能会不对。

[root@lamp01 ~]# [[ 2 > 1 ]] && echo 1 || echo 0
1
[root@lamp01 ~]# [[ 2 > 11 ]] && echo 1 || echo 0 ====>只比较第一位,逻辑结果不对。
1
[root@lamp01 ~]# [[ 2 > 31 ]] && echo 1 || echo 0 ====>只比较第一位,逻辑结果不对。
0

数比较不要加双引号:系统脚本例子

整数比较推荐方法:

[ $numl -eq $num2 ]  ===>注意空格,和比较符号

(($num1>$num2))  ===>无需空格,常规数据比较符号。

--------------------------------------------------------------------------------------------------------

测试结果结论:

1、整数加双引号也是对的。

2、[]用>号的写法语法没错,逻辑结果不对。

3、[[]]用-eq等的写法也是对的,[[]]用>写法也可能不对,只比较第一位,逻辑结果不对。

逻辑操作符

在[]和test中使用         在[[]]中使用             说明

-a                               &&               and与,两端都为真,则真

-o                                 ||                or或,两端有一个真,则真

!                                  !                  not非,相反则为真

测试:

[root@lamp01 ~]# a1=/etc/rc.local
[root@lamp01 ~]# a2=/etc/services
[root@lamp01 ~]# [ -f "$a1" && -f "$a2" ]&&echo 1||echo 0
-bash: [: missing `]‘
0
[root@lamp01 ~]# [ -f "$a1" -a -f "$a2" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [[ -f "$a1" && -f "$a2" ]]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -n "$a1" -a -z "$a2" ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -n "$a1" -o  "$a1"="$a2" ]&&echo 1||echo 0
1

如果你非要单中括号加&&或||可以用以下方法:

[root@lamp01 ~]# a1=/etc/rc.local
[root@lamp01 ~]# a2=/etc/services
[root@lamp01 ~]# [ -f "$a1" ]||[ -e "$a2" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -f "$a1" ]&&[ -e "$a2" ]&&echo 1||echo 0
1

!非逻辑符号:

[root@lamp01 ~]# [ -f "$a1" ]&&[ -e "$a2" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ ! -f "$a1" ]&&[ -e "$a2" ]&&echo 1||echo 0
0
[root@lamp01 ~]# test -f "$a1" -a -e "$a2" &&echo 1||echo 0
1
[root@lamp01 ~]# test !  -f "$a1" -a -e "$a2" &&echo 1||echo 0
0

提醒:

1、“-a” 和 “-o” 和“!”逻辑操作符号用于 [] 中使用。

2、“&&”和“||” 和“!”逻辑操作符号用户 [[]] 中使用。

3、注意括号两端,必须要有空格。

4、test用法和 [] 相同。

5、多个[]之间以及多个[[]]之间,或者任意混合中间逻辑操作符都是&&或||。

原文地址:https://www.cnblogs.com/su-root/p/10328427.html

时间: 2024-10-08 13:56:48

shell 的条件表达式及逻辑操作符简单介绍的相关文章

shell脚本编程学习笔记-逻辑操作符

1.1 下表为逻辑操作符 提示: !中文意思是反:与一个逻辑值相反的逻辑值. -a中文意思是与(&&):两个逻辑值都为真返回值才为真,反之为假. -o中文意思是或(or):两个逻辑值只要一个为真,返回值为真. 结论: (1)-a和&&的运算规则:只有两端都是1才为真相当于乘法运算. 真 true 1 假 false 0 And 1*0=0 And 0*1=0 And 1*1=1 And 0*0=0 只有两端都是1才为真,and交集 (2)-o或||两端都是0才为假,任何一端

9-Shell的逻辑操作符知识介绍-实践及企业案例脚本剖析

逻辑操作符 在[]和test中使用的逻辑操作符 在[[]]中使用的逻辑操作符 说明 -a && and与,两端都为真,则真 -o || or或,两端有一个为真则真 ! ! not非,相反则为真 提示: !中文意思是反:与一个逻辑值相反的逻辑值 -a中文意思与(and &&):两个逻辑值都为真,返回值才为真,反之为假 -o中文意思是或(or||):两个逻辑值只要有一个为真,返回值就为真 举例: [[email protected] ~]# [ $a -eq 2 -a $b -

[shell]函数+条件表达式

了解了下shell的函数和case语句: 函数格式: function(){ } 例子: function rsyncstart() { if [ "${status1}X" == "X" ];then rm -f $pidfile ${start_rsync} status2=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep') if [ "${status2

怎样用 Bash 编程:逻辑操作符和 shell 扩展

学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程)讲解如何在 CLI 使用 Bash 编程. 第一篇文章 讲解了 Bash 的一些简单命令行操作,包括如何使用变量和控制操作符.第二篇文章探讨文件.字符串.数字等类型和各种各样在执行流中提供控制逻辑的的逻辑运算符,还有 Bash 中的各类 shell 扩展.本系列第三篇也是最后一篇文章,将会探索能重

Shell编程——条件判断(2)

Shell编程之条件判断 条件测试操作 test命令 测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值 格式1:test 条件表达式 格式2:[ 条件表达式 ] 文件测试[ 操作符 文件或目录 ]常用的测试操作符-d:测试是否为目录-e:测试目录或文件是否存在-f:测试是否为文件-r:测试当前用户是否有权限读取-w:测试当前用户是否有权限写入-x:测试当前用户是否有权限执行整数值比较[ 整数1 操作符 整数2 ]常用的测试操作符-eq:等于-ne:不等于-gt:大于-

Shell编程 之 条件表达式

1 #!/bin/bash -   2 #===============================================================================  3 #  4 #          FILE: condition_expression_test.sh  5 #   6 #         USAGE: ./condition_expression_test.sh   7 #   8 #   DESCRIPTION:   9 #  10 #

Linux Shell脚本逻辑操作符简介

在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a condition2 结果:codition1和conditon2 都为真,才返回真,否则返回假. 演示:测试可执行文件lnmp [plain] view plaincopy [[email protected] ~]# [ -x lnmp -a -f lnmp ]   #lmmp是可执行且是文件 

shell条件表达式

shell编程中经常需要判断文件状态.字符串是否相等以及两个数值大小等情况,基于这些比较结果再做执行相关操作.本文主要讲述文件状态.字符串.数值大小的判断方法. 文件状态判断 文件状态的判断通常使用test命令完成,test命令有2种基本格式:test condition / [ condition ].后者使用时,需注意在条件两边加上空格,此种格式最为常用. 判断文件状态的表达式有很多,常用表达式如下: -e 判断文件或目录存是否存在 -f 判断是否为文件 -d 判断是否为目录 -r 判断文件

shell中的条件表达式

条件表达式返回的结果都为布尔型 真为1,假为0 条件测试的表达式 [expression] [[expression]] test expression 常用的: 单目: -e  File  测试文件是否存在 -f  File  测试文件是否是普通文件 -d  File 测试指定路径是否是目录 -r  File 测试文件是否有写的权限 -w  File 测试文件是否有写的权限 -x  File测试文件是否有执行的权限 -z:判断指定的变量是否存在值 -n:测试字符是否为空 空为真 !:逻辑非 双