bash脚本编程之二 条件判断and 逻辑运算
1、条件测试结构
1) if/then结构:
判断命令列表的退出码是否为0,0为成功。
如果if和then在条件判断的同一行上的话, 必须使用分号来结束if表达式;
if和then都是关键字。
关键字(或者命令)如果作为表达式的开头, 并且如果想在同一行上再写一个新的表达式的话, 那么必须使用分号来结束上一句表达式。
if
[ condition1 ]
then
command1
command2
command3
elif
[ condition2 ]
then
# 与else if一样
command4
command5
else
default-
command
fi
if/then结构可以包含嵌套的比较操作和条件判断操作:
if echo "Next *if* is part of the comparison for the first *if*." if [[ $comparison = "integer" ]] then (( a < b )) else [[ $a < $b ]] fi then echo '$a is less than $b' fi |
2) 内建命令[与test命令等价,把参数作为比较表达式和文件测试,true返回0,false返回1。
注意:[ 数字 ]、[ 字符串 ]都为真,NULL(空状态)、未未定义(或者叫为初始化的变量)、初始化但赋值为null的变量为假
3) bash2.02以后支持[[..]]关键字,比[]结构更加通用
在[[]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换;使用[[]]能防止脚本中的很多逻辑错误,比如 &&, ||, <, >操作符能正常存在于[[]]中,如果出现在[]中会报错。
if
[ $a =
"123"
&& $b =
"456"
];
then
//
报错
echo
"True"
else
echo
"False"
fi
if
[[ $a =
"123"
&& $b =
"456"
]];
then
//
正确
echo
"True"
else
echo
"False"
fi
if
[ $a =
"789"
|| $b =
"456"
];
then
//
报错
echo
"True"
else
echo
"False"
fi
if
[[ $a =
"789"
|| $b =
"456"
]];
then
//
正确
echo
"True"
else
echo
"False"
fi
if
[ $a < $b ];
then
//
报错
echo
"True"
else
echo
"False"
fi
if
[[ $a < $b ]];
then
//
正确
echo
"True"
else
echo
"False"
fi
4) 列表结构
在中括号中的条件判断不一定非得有if
1
2
|
[ "$var1" - ne "$var2" ] && echo "$var1 is not equal to $var2" [ -d "$home" ] || echo "$home directory does not exist." |
双中括号也是可以的
5) ((…))和let …, 当算数表达式的结果非零时,返回退出状态码0
2、文件测试操作符
-e 文件存在
-f 一个一般文件(不是目录或者设备文件)
-s 文件大小不为0
-d 一个目录
-b 块设备
-c 字符设备
-p 管道
-h or –L 符号链接
-S socket
-t 文件描述符被关联到一个终端设备上,一般用来检测stdin([ -t 0 ])和stdout([ -t 1 ])是否来自于一个终端
-r 文件是否具有可读权限
-w 文件是否具有可写权限
-x 文件是否具有可执行权限
-u set-user-id (suid)标记被设置到文件上。如果一个root用户所拥有的二进制可执行文件设置了set-user-id标记位的话, 那么普通用户也会以root权限来运行这个文件。
对于设置了suid标志的文件, 在它的权限列中将会以s表示。注意这样可能导致安全漏洞
-k 设置粘贴位
对于"粘贴位"的一般了解, save-text-mode标志是一个文件权限的特殊类型。如果文件设置了这个标志, 那么这个文件将会被保存到缓存中, 这样可以提高访问速度。粘贴位如果设置在目录中, 那么它将限制写权限. 对于设置了粘贴位的文件或目录, 在它们的权限标记列中将会显示t。在当代unix系统中,文件已经不使用粘贴位,只在目录中用
-N 从文件上一次被读取到现在为止,文件是否被修改过
f1 –nt f2 文件f1比文件f2新
f1 –ot f2 文件f1比文件f2旧
f1 –ef f2 文件f1和f2是相同文件的硬链接
! 翻转测试结果
3、其他比较操作符
1) 整数比较
在中括号中使用:-eq、-ne、-gt、-ge、-lt、-le
在双小括号中使用:<、<=、>、>=
2) 字符串比较
=与==等价。注意,==在双中括号和单中括号中行为不同:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
a= "zabc" [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么结果将为真 [[ $a == "z*" ]] # 如果$a与z*相等(就是字面意思完全一样), 那 么结果为真. a=abc.conf #abc.conf is a file [ $a == abc* ] # 文件扩展匹配(file globbing)和单词分割有 效.True a= "abcdef" #just a string, not a file [ $a == abc* ] #False [ "$a" == "z*" ] # 如果$a与z*相等(就是字面意思完全一样), 那 么结果为真. #总结起来,[]的使用很危险,存在各种可能的扩展,如果要用,最好对变量加上引号 |
!=,不等,在[[]]中使用模式匹配
<、>在[]结构中要转义
-z 字符串为null,就是字符串长度为0
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/bin/bash a= "hello" b= "" c= [ -z $a ] && echo "a null" [ -z $b ] && echo "b null" [ -z $c ] && echo "c null" [ -z $d ] && echo "d null" #结果 #b null #c null #d null |
-n 字符串不为null。当-n使用在中括号中进行条件测试的时候, 必须要把字符串用双引号引用起来。
-a 逻辑与。 exp1 –a exp2; -o 逻辑或 exp1 –o exp2;这与Bash中的比较操作符&&和||非常相像, 但是&&和||是用在双中括号结构中的。
特别注意:在一个混合测试中, 即使使用引用的字符串变量也可能还不够。如果$string为空的话, [ -n "$string" -o "$a" = "$b" ]可能会在某些版本的Bash中产生错误. 安全的做法是附加一个额外的字符给可能的空变量, [ "x$string" != x -o "x$a" = "x$b" ] ("x"字符是可以相互抵消的).
bash脚本编程之二 条件判断and 逻辑运算的更多相关文章
- 5-3 bash脚本编程之二 条件判断
1. 条件测试的表达式 1. [ expression ] :注意这个中括号的前后都有一个空格 2. [[ expression ]] 3. test expression 2.条件判断的类型 1. ...
- 高级Bash脚本编程(二)
高级Bash脚本编程(二) 退出 退出状态码 退出:exit 被用来结束一个脚本,它也返回一个值,并且这个值会传递给脚本的父进程,父进程会使用这个值做下一步的处理. 每个命令都会返回一个退出状态码,成 ...
- bash脚本编程之二 字符串测试及for循环
shell中大量的测试和比较选项而困惑呢? 这个技巧可以帮助您解密不同类型的文件.算术和字符串测试,这样您就能够知道什么时候使用 test. [ ]. [[ ]].(( )) 或 if-then-el ...
- Bash脚本编程学习笔记06:条件结构体
简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...
- Bash脚本编程总结
bash脚本编程之用户交互: read [option]… [name …] -p ‘PROMPT’ -t TIMEOUT bash -n /path/to/some_script 检测脚本中的 ...
- Bash脚本编程学习笔记08:函数
官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...
- Bash脚本编程学习笔记07:循环结构体
本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...
- Bash脚本编程之算术运算
简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence).结合性(associativity)和值,详见Shell Arithmet ...
- Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量
我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...
随机推荐
- PAT (Basic Level) Practise:1022. D进制的A+B
[题目连接] 输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数. 输入格式: 输入在一行中依次给出3个整数A.B和D. 输出格式: ...
- IOS 不兼容 伪类active
添加空的 事件ontouchstart 例 <body ontouchstart>
- 跨域之-jquery操作
在JQ进行跨域的操作,用的是jsonp的方式,创建script标签,除了跨域的行为外,本地的操作方式都是xmlHttpRequest.
- i++; 与 ++i;的内部区别。
对于一个用前置自加和后置自加的效果相同的地方,我们应该用哪个呢? 例: for(point i = 0; i != N; ?): 上面for语句中的“?”处,你会在那里写i++还是++i呢? 前置++ ...
- Python 基础语法(三)
Python 基础语法(三) --------------------------------------------接 Python 基础语法(二)------------------------- ...
- 认识CPU Cache
http://geek.csdn.net/news/detail/114619 7个示例科普CPU Cache:http://coolshell.cn/articles/10249.html Linu ...
- CentOS中Device eth0 does not seem to be present错误解决办法
今天克隆的虚拟机,当需要多台虚拟机的时候,试用克隆真是方便,不过遇到了 Device eth0 does not seem to be present 的问题,在网上找到遇到同样问题的解决方法, 很顺 ...
- 单例设计模式getInstance()
对象的实例化方法,也是比较多的,最常用的方法是直接使用new,而这是最普通的,如果要考虑到其它的需要,如单实例模式,层次间调用等等. 直接使用new就不可以实现好的设计好,这时候需要使用间接使用n ...
- maxscript, 批量导出物体
1,将场景中所有选中物体整体导出为一个fbx文件 exportfile filename #noprompt selectedOnly:true using:FBXEXP 2,将场景中所有选中物体各导 ...
- 深入理解Java内存模型(一)——基础(转)
转自程晓明的"深入理解Java内存模型"的博客 http://www.infoq.com/cn/articles/java-memory-model-1 并发编程模型的分类 在并发 ...