Shell逻辑运算符及表达式
一. 运算符总结说明
1. 条件运算符
运算符号 | 代表意义 | 应用 | 说明 |
---|---|---|---|
= | 等于 | 整型或字符串比较: str1 = str2 | 字符串str1 和字符串str2 相等时返回真,如果在[]中,只能是字符串 |
== | 等于 | 整型或字符串比较: str1 == str2 | 字符串str1 和字符串str2 相等时返回真,如果在[]中,只能是字符串 |
!= | 不等于 | 整型或字符串比较: str1 != str2 | 字符串str1和字符串str2不相等时返回真,如果在[]中,只能是字符串 |
< | 小于 | 整型或字符串比较: str1 < str2 | 按字典顺序排序,字符串str1 在字符串str2 之前,在[]中,它表示字符串,如需使用请转义\< |
> | 大于 | 整型和字符串比较 | 在[]中,它表示字符串,如需使用请转义\> |
-eq | 等于 | 整型比较: int1 -eq int2 | 如果int1 等于int2,则返回真 |
-ne | 不等于 | 整型比较: int1 -ne int2 | 如果int1 不等于int2,则返回真 |
-lt | 小于 | 整型比较: int1 -lt int2 | 如果int1 小于int2,则返回真 |
-gt | 大于 | 整型比较: int1 -gt int2 | 如果int1 大于int2,则返回真 |
-le | 小于或等于 | 整型比较: int1 -le int2 | 如果int1 小于等于int2,则返回真 |
-ge | 大于或等于 | 整型比较: int1 -ge int2 | 如果int1 大于等于int2,则返回真 |
-z | 空字符串 | 字符串比较: -z string | 字符串string 为空串(长度为0)时返回真 |
-n | 非空字符串 | 字符串比较 :-n string | 字符串string 为非空串时返回真 |
2. 逻辑运算符
运算符号 | 代表意义 | 应用 | 说明 |
---|---|---|---|
-a | 双方都成立(and) | 逻辑表达式 –a 逻辑表达式 | 在[] 表达式中使用 |
-o | 单方成立(or) | 逻辑表达式 –o 逻辑表达式 | 在[] 表达式中使用 |
! | 逻辑否,条件为假,结果为真。 | ||
&& | 双方都成立(and) | 逻辑表达式 && 逻辑表达式 | 在[[]] 表达式中使用 |
\ | \ | 单方成立(or) |
3. 文件和目录的判断
逻辑符号 | 代表意义 | 应用 | 说明 |
---|---|---|---|
-f | 判断文件是否存在 | -f filename | 当filename 存在并且是正规文件时返回真 |
-d | 判断目录是否存在 | -d pathname | 当pathname 存在并且是一个目录时返回真 |
-b | 判断是否为一个【block档案】 | -b filename | 当filename 存在并且是块文件时返回真(返回0) |
-c | 判断是否为一个[character档案] | -c filename | 当filename 存在并且是字符文件时返回真 |
-S | 判断是否为一个[socket 标签档案] | -S filename | 当filename 存在并且是socket 时返回真 |
-L | 判断是否为一个[symbolic link 的档案] | -L filename | 当filename 存在并且是符号链接文件时返回真 |
-e | 判断【某个东西】是否存在 | -e pathname | 当由pathname 指定的文件或目录存在时返回真 |
4. 程序的逻辑卷标判断
逻辑符号 | 代表意义 | 应用 | 说明 |
---|---|---|---|
-G | 判断是否由 GID 所执行的程序所拥有 | -G pathname | 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真 |
-O | 判断是否由 UID 所执行的程序所拥有 | -O pathname | 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写) |
-p | 判断是否为程序间传送信息的 name pipe 或是 FIFO | -p filename | 当filename 存在并且是命名管道时返回真 |
5. 档案的属性判断
逻辑符号 | 代表意义 | 应用 | 说明 |
---|---|---|---|
-r | 判断是否为可读的属性 | -r pathname | 当由pathname 指定的文件或目录存在并且可读时返回真 |
-w | 判断是否为可以写入的属性 | -w pathname | 当由pathname 指定的文件或目录存在并且可写时返回真 |
-x | 判断是否为可执行的属性 | -x pathname | 当由pathname 指定的文件或目录存在并且可执行时返回真 |
-s | 判断是否为『非空白档案』 | -s filename | 当filename 存在并且文件大小大于0 时返回真 |
-u | 判断是否具有『 SUID 』的属性 | -u pathname | 当由pathname 指定的文件或目录存在并且设置了SUID 位时返回真 |
-g | 判断是否具有『 SGID 』的属性 | -g pathname | 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真 |
-k | 判断是否具有『 sticky bit 』的属性 | -k pathname | 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真 |
6.两个档案之间的判断与比较
逻辑符号 | 代表意义 | 应用 | 说明 |
---|---|---|---|
-nt | 第一个档案比第二个档案新 | file1 -nt file2 | file1 比file2 新时返回真 |
-ot | 第一个档案比第二个档案旧 | file1 -ot file2 | file1 比file2 旧时返回真 |
-ef | 第一个档案与第二个档案为同一个档案( link 之类的档案) | f1 -ef f2 | files f1 and f2 are hard links to the same file |
二. 逻辑表达式+运算符举例说明
#! bin/bash echo "========= 逻辑表达式 test ========="
#注意:所有字符与逻辑运算符直接用“空格”分开,不能连到一起。
if test -eq -a == ;then echo "true" ;fi #当3 大于 或 大于 并且 bxp 不等于 bixiaopeng 或 变量website不为空时,为真
if test > -a -gt -a "bxp" != "bixiaopeng" -o -n "$website" ;then echo "true"; else echo "false"; fi #判断文件是否存在
if test -f "/Users/bixiaopeng/justtest.txt" ;then echo "true"; else echo "false"; fi
#判断目录是否存在
if test -d "/Users/bixiaopeng" ;then echo "true"; else echo "false"; fi echo "========= 逻辑表达式 [] =========" #在[] 表达式中,常见的>,<需要加转义字符,表示字符串大小比较,以acill码位置作为比较。
#不直接支持<>运算符,还有逻辑运算符 || 和 && 它需要用-a[and] –o[or]表示。
if [ -eq -a == ];then echo "true" ;fi #当3 大于 或 大于 并且 bxp 不等于 bixiaopeng 或 变量website不为空时,为真
if [ \> -a -gt -a "bxp" != "bixiaopeng" -o -n "$website" ] ;then echo "true"; else echo "false"; fi #判断文件是否存在
if [ -f "/Users/bixiaopeng/justtest.txt" ] ;then echo "true"; else echo "false"; fi
#判断目录是否存在
if [ -d "/Users/bixiaopeng" ] ;then echo "true"; else echo "false"; fi echo "========= 逻辑表达式 [[]] =========" #[[]] 运算符只是[]运算符的扩充。能够支持<,>符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符 || 和 &&
if [[ -eq && == ]];then echo "true" ;fi #当3 大于 或 大于 并且 bxp 不等于 bixiaopeng 或 变量website不为空时,为真
if [[ > && -gt && "bxp" != "bixiaopeng" || -n "$website" ]] ;then echo "true"; else echo "false"; fi #判断文件是否存在
if [[ -f "/Users/bixiaopeng/justtest.txt" ]] ;then echo "true"; else echo "false"; fi
#判断目录是否存在
if [[ -d "/Users/bixiaopeng" ]] ;then echo "true"; else echo "false"; fi #[[]] 中可以使用通配符,不需要引号
[[ $myname = b*peng ]] && echo "true"
6.1 test 命令
# test 1 = 1 && echo 'ok' ok # test -d /etc/ && echo 'ok' ok # test 1 -eq 1 && echo 'ok' ok # if test 1 = 1 ; then echo 'ok'; fi ok
注意:所有字符 与逻辑运算符直接用“空格”分开,不能连到一起。test 1=1就是错误的!
6.2 [] 表达式
# [ 1 -eq 1 ] && echo 'ok' ok # [ 2 < 1 ] && echo 'ok' -bash: 2: No such file or directory # [ 2 \< 1 ] && echo 'ok' # [ 2 -gt 1 -a 3 -lt 4 ] && echo 'ok' ok # [ 2 -gt 1 && 3 -lt 4 ] && echo 'ok' -bash: [: missing `]'
注意:在[] 表达式中,常见的>, <需要加转义字符,表示字符串大小比较,以acill码 位置作为比较。
不直接支持<, >运算符,还有逻辑运算符|| , && 它需要用-a[and] –o[or]表示
6.3 [[]] 表达式
# [ 1 -eq 1 ] && echo 'ok' ok # [[ 2 < 3 ]] && echo 'ok' ok #[[ 2 < 3 && 4 > 5 ]] && echo 'ok' ok [[ 2 < 3 -a 3 > 4 ]] && echo "ok" -bash: syntax error in conditional expression -bash: syntax error near `-a'
注意:[[]] 运算符只是[]运算符的扩充。能够支持<,>符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| && ,不再使用-a -o
华丽丽的分割线
**********************************************************************************************************************************************
另外一部份总结:
bash shell中` `与[ ]的区别
一,[[用"&&"而不是"-a"表示逻辑"与",用"||"而不是"-o"表示逻辑"或":
# [[ 1 < 2 && b > a ]] && echo true || echo false true # [[ 1 < 2 -a b > a ]] && echo true || echo false bash: syntax error in conditional expression bash: syntax error near `-a’ # [ 1 < 2 -a b > a ] && echo true || echo false true # [ 1 < 2 && b > a ]&& echo true || echo false #wrong syntax bash: [: missing `]‘ false
二,[ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符”>” 与”<”必须转义,否则就变成IO改向操作符了。[[中"<"与">"不需转义:
# [ 2 \< 10 ] && echo true || echo false #you should use “\<” false #[ 2 -lt 10 ] && echo true || echo false true # [[ 2 < 10 ]] && echo true || echo false false
三,` `.``.``.` `进行算术扩展,而[ ... ]不做。
# [[ 99+1 -eq 100 ]] && echo true || echo false true # [ 99+1 -eq 100 ] && echo true || echo false bash: [: 99+1: integer expression expected false # [ $((99+1)) -eq 100 ] && echo true || echo false true
四,[[]]能用正则,而[]不行
# [ "test.php" == *.php ] && echo true || echo false false # [[ "test.php" == *.php ]] && echo true || echo false true # [[ "t.php" == [a-z].php ]] && echo true || echo false true # [ "test.php" == "*.php" ] && echo true || echo false false # [[ "test.php" == "*.php" ]] && echo true || echo false false
注意:双引号("")的作用
Shell逻辑运算符及表达式的更多相关文章
- Linux Shell逻辑运算符和表达式详解
Shell 逻辑运算符涉及以下几种类型,只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑判断1.关于文件与目录的逻辑判断-f 常用.判断『文件』是否为普通文件,比如: if [ ...
- linux shell 逻辑运算符、逻辑表达式详解
shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测 ...
- shell之条件表达式
conditional expressions are used by the [[ compound command and the test and [ builtin commands. ari ...
- linux shell 逻辑运算符、逻辑表达式
shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决很多复杂的判断. 一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 e ...
- 【转】linux shell 逻辑运算符、逻辑表达式
shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决很多复杂的判断. 一.逻辑运算符 逻辑卷标表示意思 1.关于档案与目录的侦测逻辑卷标! -f常用!侦测‘档案’是否存在 eg: ...
- 【转】linux shell 逻辑运算符、逻辑表达式详解
shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测 ...
- shell 的条件表达式及逻辑操作符简单介绍
查看系统的shell: cat /etc/shells 文件测试表达式: -f 文件 文件存在且为普通文件则真,即测试表达式成立. -d 文件 文件存在且为目录文件则真,即测试表达式成立. -s ...
- Shell中的表达式及IF
#!/bin/bash #你值得收藏的四则表达式运算. val1=1 val2=1 val3=1 val4=1 val5=1 val6=1 val7=1 let val1++ ((val2++)) v ...
- shell逻辑运算符
逻辑运算符 以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20: 运算符 说明 举例 && 逻辑的 AND [[ $a -lt 100 && ...
随机推荐
- 机器学习实战_基于Scikit-Learn和Tensorflow读书笔记
第一部分 机器学习基础 第二部分 神经网络和深度学习 第9章 运行Tensorflow 分布式系统:分布式系统的定义是这个系统建立在网络的操作系统,具有高度的内聚性和透明性,它与网络的区别在于高层软件 ...
- TCP协议分析(包结构)---转
TCP首部格式 tcp数据是被封装在IP数据包中的,和udp类似,在IP数据包的数据部分.tcp数据包的格式如下: 源端口号和目的端口号(寻址)与udp中类似,用于寻找发端和收端应用进程.这两个值加上 ...
- Cannot modify header information - headers already sent by出错的原因
<?php ob_start(); setcookie("username","送家",time()+3600); echo "the user ...
- 进程池和multiprocess.Pool模块
一.为什么要有进程池 首先,创建进程需要消耗时间,销毁进程也需要时间.其次,即使开启了成千上万的进程,操作系统也不能让它们同时执行,这样反而会影响程序的效率.因此我们不能无限制的根据任务开启或者结束进 ...
- 1、引言(Introduction)
1.1 欢迎 在生活中用到的机器学习算法: (1)打开谷歌.必应搜索到你需要的内容,正是因为他们有良好的学习算法 (2)每次您阅读您的电子邮件垃圾邮件筛选器,可以帮你过滤大量的垃圾邮件 机器学习为什么 ...
- hdu1394 Minimum Inversion Number (线段树求逆序数&&思维)
题目传送门 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 构建自己的AngularJS,第一部分:作用域和digest 转摘:http://www.ituring.com.cn/article/39865
构建自己的AngularJS,第一部分:Scope和Digest 原文链接:http://teropa.info/blog/2013/11/03/make-your-own-angular-part- ...
- JavaScript中的柯里化
转载自:https://www.cnblogs.com/zztt/p/4142891.html 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Ha ...
- vue项目build打包后图片路径不对导致图片空白不显示问题解决方法
1.在上篇文章src配置及引入的基础上修改项目配置: 文章链接地址:https://www.cnblogs.com/hsl-shiliang/p/10333022.html. 2.具体配置过程如图: ...
- 毕设问题(1)表格table的表头自定义、复合表头,组合表格
毕业设计,是一个web项目,遇到的些问题,记录下来.也许也有同样只知道一些,不是那么系统的学过的人,会遇到同样的问题,希望有所帮助. 百度知道有这样一个问题: bootstrap table 如何实现 ...