书写优雅的shell脚本(一)- if语句
使用unix/linux的程序人员几乎都写过shell脚本,但这其中很多人都是为了完成功能而在网上找代码段,这样写出来的shell脚本在功能方面当然是没有什么问题,但是这样的方式不能写出优雅的shell脚本。
从今天开始,starfe就将自己平时在书写shell脚本过程中的经历做一总结,力图形成一个系列---“书写优雅的shell脚本”。
在此,对“优雅”一词的定义有4点:(1)健壮;(2)结构清晰;(3)性能好;(4)力求简单。
好了,废话不多说,开始今天的主题:if语句
1. if判断式
(1)
if [ 条件判断一 ] &&(||) [ 条件判断二 ]; then
xxx
fi
(2)
if [ 条件判断一 ] &&(||) [ 条件判断二 ]; then
xxx
else
xxx
fi
(3)
if [ 条件判断一 ] &&(||) [ 条件判断二 ]; then
xxx
elif [ 条件判断三 ] &&(||) [ 条件判断四 ]; then
xxx
...
else
xxxx
fi
2. if中的二元比较
2.1 整数比较
-eq 等于,如:if [ $a -eq $b ]
-ne 不等于,如:if [ $a -ne $b ]
-gt 大于,如:if [ $a -gt $b ]
-ge 大于等于,如:if [ $a -ge $b ]
-lt 小于,如:if [ $a -lt $b ]
-le 小于等于,如:if [ $a -le $b ]
>大于,如:[ $a > $b ]
>= 大于等于,如:[ $a >= $b ]
注:以上其实不是健壮的代码,上面这些代码在有些情况下会存现错误提示,而真正健壮的是使用双括号来表示,即if [[ $a -eq $b ]]
这是为何?做个测试如下:
$>a=;b=3;
$>if [ a -gt $b ]; then echo "true";fi
-bash: [: -gt: unary operator expected //报错
而改为$>if [[ a > 3 ]]; then echo "true";fi //不再报错,这也是我们所期望的
究其原因,是因为如果变量a值为空(由于shell是弱类型语言,对变量赋值都是当字符串对待),那么就成了
[ -gt 3 ] ,显然 [ 和 $b 不相等并且缺少了 [ 符号,所以报了这样的错误。当然不总是出错,如果变量a值不为空,程序就正常了,所以这样的错误还是很隐蔽的。
或者用下面的方法也能避免这种错 误:if [ "$a"x -gt "$b"x ]; then echo "true"; fi。当然,x也可以是其他字符。顺便提一点,shell中有没有双引号在很多情况下是一致的。
2.2 字符串比较
等于,如:if [ $a = $b ]或if [ $a == $b ],与=等价
不等于,如:if [ $a != $b ]
大于,在ASCII字母顺序下.如:if
[ $a \> $b ]
小于,在ASCII字母顺序下.如:if
[ $a \< $b ] 注意:要使用转义符“\”。
2.3 文件比较
[
文件1 -nt 文件2 ] 为真 如果 文件1 has been changed more recently than 文件2, or 如果文件1 存在 而且文件2
does not。
[ 文件1 -ot 文件2 ] 为真 如果 文件1 比 文件2 旧, 或者 文件2 存在而且
文件1 不存在。
[ 文件1 -ef 文件2 ] 为真 如果 文件1 而且 文件2 refer to the
same device 而且 inode numbers。
2.4 表达式比较
[ 表达式1
-a 表达式2 ] 如果表达式1 而且表达式2 同时为真则为真 。
[ 表达式1 -o 表达式2 ] 如果表达式1 或者表达式2 其中之一为真则为真。
3.if中的一元比较
[ -b 文件 ] 如果 文件 存在 而且 是一个 块-特殊 文件为真。
[ -c 文件 ] 为真 如果 文件 存在 而且 是一个 字-特殊 文件。
[ -e 文件 ] 为真 如果 文件 存在。
[ -f 文件 ] 为真 如果 文件 存在 而且 是一个 普通 文件。
[ -g 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SGID 位。
[ -h 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。
[ -k 文件 ] 为真 如果 文件 存在 而且 他的粘住位已经设置。
[ -p 文件 ] 为真 如果 文件 存在 而且 是一个 已经命名的管道 (F 如果O)。
[ -r 文件 ] 为真 如果 文件 存在 而且 是可读的。
[ -s 文件 ] 为真 如果 文件 存在 而且 比零字节大。
[ -t FD ] 为真 如果 文件 文件描述符已经打开 而且 指向一个终端。
[ -u 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SUID (set user ID)位。
[ -w 文件 ] 为真 如果 文件 为真 如果 文件 存在 而且 是可写的。
[ -x 文件 ] 为真 如果 文件 存在 而且 是可执行的。
[ -O 文件 ] 为真 如果 文件 存在 而且 属于有效用户ID。
[ -G 文件 ] 为真 如果 文件 存在 而且 属于有效组ID。
[ -L 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。
[ -N 文件 ] 为真 如果 文件 存在 而且 has been mod 如果ied since it was last read。
[ -S 文件 ] 为真 如果 文件 存在 而且 是一个 socket。
[ -o 选项名 ] 为真 如果 shell 选项 "选项名" 开启。
[ -z STRING ] 为真 如果 "STRING"的长度是零。
[ -n STRING ] 或者 [ STRING ] 为真 "STRING"的长度是非零值。
[ ! EXPR ] 如果EXPR 为假则为真。
[ ( EXPR ) ] 返回EXPR 的值。 这样可以用来忽略正常的操作符优先级。
书写优雅的shell脚本(一)- if语句的更多相关文章
- 书写优雅的shell脚本(五)- shell中(())双括号运算符
在使用shell的逻辑运算符"[]"使用时候,必须保证运算符与算数之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构 ...
- 书写优雅的shell脚本(三) - shell中exec解析
参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...
- 书写优雅的shell脚本(六)- shell中的命令组合(&&、||、())
shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中.当 $? == 0 时,表示执行成功:当 $? == 1 时,表示执行失败. 有时候,下一条命令依赖前 ...
- 书写优雅的shell脚本(四) - kill命令的合理使用
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须 ...
- 书写优雅的shell脚本(插曲) - kill
shell之kill.killall.xkill.pkill 2013-01-08 22:03:28| 分类: Linux|举报|字号订阅 1 kill kill的应用是和ps 或pgrep 命令结 ...
- 书写优雅的shell脚本(二)- `dirname $0`
在命令行状态下单纯执行 $ cd `dirname $0` 是毫无意义的.因为他返回当前路径的".". 这个命令写在脚本文件里才有作用,他返回这个脚本文件放置的目录,并可以根据这个 ...
- 书写优雅的shell脚本(八)- 日期格式化
1. 将日期格式转为时间戳 获取当前时间:currenttime=`date "+%Y-%m-%d %H:%M:%S"` 结果:2015-04-13 11:15:43 将当前时间转 ...
- 书写优雅的shell脚本(七)- ${COLUMN:-}
${COLUMN:-} 如果COLUMN是空变量,或者变量不存在,返回-后面的内容,如果变量有值返回这个值.
- 书写优雅的shell脚本(插曲)- /proc
1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...
随机推荐
- thinkphp框架做项目的前期配置
ThinkPHP 目录结构说明 ThinkPHP.php:框架的公共入口文件 App:项目放置目录 Common:包含框架的一些公共文件.系统定义.系统函数和惯例配置等 Lang:系统语言文件目录 L ...
- IOS -- base64编码
在iOS7以后可以用NSData自带的base64EncodedStringWithOptions进行编解码: 方法如下: - (NSString *)encodeToBase64String:(UI ...
- 如何快速的开发一个完整的iOS直播app(美颜篇)
前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,美颜功能是很重要的,如果没有美颜功能,可能分分钟钟掉粉千万,本篇主要讲 ...
- IntelliTrace窗口无法弹出的解决办法
最近在使用EF框架,所以需要IntelliTrace窗口进行对ADO的SQL生成监控.可找了半天都无法Call出该窗口. 在Debug模式下,选择调试->窗口 里面根本没有IntelliTrac ...
- INAPP登陆调用的FB接口
public function login_get (){ $this->load->helper ( 'auth' ); $redirectUrl = $this->input-& ...
- wyh2000 and pupil
wyh2000 and pupil Accepts: 93 Submissions: 925 Time Limit: 3000/1500 MS (Java/Others) Memory Lim ...
- Elasticsearch 之 慘痛部署(分片移位)
部署说明 硬件 server两台: 机器A:64G内存 机器B:32G内存 分片 共12个节点 2个查询节点.10个存储节点 8个主分片 1个复制分片(每一个分片都有一个副本分布在不同的节点上面) 每 ...
- bash仅仅读的环境变量
环境变量名 变量的用途 $0 程序的名字 $1~$9 命令參数1~9的值 $* 全部命令行參数的值 $@ 全部命令行參数的值.假设$@被""包含.即"$@",这 ...
- Beijing Bus
Search: http://bjgj.aibang.com:8899 https://github.com/sp-chenyang/bus https://github.com/leavind/Co ...
- Sublime Text2-Control Package---ShinePans
1.打开sublime Text2 2.菜单条中的preference>>BrowsePackages 3.退到上一级打开Installed Packages 4.拷贝文件到此目录 (Pa ...