使用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中的一元比较

[ -a 文件 ] 如果文件存在为真。

[ -b 文件 ] 如果 文件 存在 而且 是一个 块-特殊 文件为真。

[ -c 文件 ] 为真 如果 文件 存在 而且 是一个 字-特殊 文件。
[ -d 文件 ] 为真 如果 文件 存在 而且 是一个 目录。

[ -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语句的更多相关文章

  1. 书写优雅的shell脚本(五)- shell中(())双括号运算符

    在使用shell的逻辑运算符"[]"使用时候,必须保证运算符与算数之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构 ...

  2. 书写优雅的shell脚本(三) - shell中exec解析

    参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...

  3. 书写优雅的shell脚本(六)- shell中的命令组合(&&、||、())

    shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中.当 $? == 0 时,表示执行成功:当 $? == 1 时,表示执行失败.  有时候,下一条命令依赖前 ...

  4. 书写优雅的shell脚本(四) - kill命令的合理使用

    Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须 ...

  5. 书写优雅的shell脚本(插曲) - kill

    shell之kill.killall.xkill.pkill 2013-01-08 22:03:28|  分类: Linux|举报|字号订阅 1 kill kill的应用是和ps 或pgrep 命令结 ...

  6. 书写优雅的shell脚本(二)- `dirname $0`

    在命令行状态下单纯执行 $ cd `dirname $0` 是毫无意义的.因为他返回当前路径的".". 这个命令写在脚本文件里才有作用,他返回这个脚本文件放置的目录,并可以根据这个 ...

  7. 书写优雅的shell脚本(八)- 日期格式化

    1. 将日期格式转为时间戳 获取当前时间:currenttime=`date "+%Y-%m-%d %H:%M:%S"` 结果:2015-04-13 11:15:43 将当前时间转 ...

  8. 书写优雅的shell脚本(七)- ${COLUMN:-}

    ${COLUMN:-} 如果COLUMN是空变量,或者变量不存在,返回-后面的内容,如果变量有值返回这个值.

  9. 书写优雅的shell脚本(插曲)- /proc

    1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...

随机推荐

  1. Xcode打包应用为ipa

    Xcode教程 Xcode4发布测试 打包Archive操作是本文要介绍的内容,发布测试的最后一步打包(Archive),Xcode4帮助文档有比较详细介绍,但是居然是错的,这里说明一下. 1.设置& ...

  2. Day 8 Linux之Day8

    Linux 之 Day 8 一.Linux网络原理及基础设置 1. 使用ifconfig命令来维护网络 1) ifconfig命令的功能:显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址. ...

  3. CSS 选择器语法参考手册

    转自:http://www.w3school.com.cn/cssref/css_selectors.asp CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. &quo ...

  4. matlab安装及破解

    Matlab安装及破解: 笔者最近要做一些和建模相关的事,故此需要安装Matlab2017版.在此做下笔记. 网盘链接: 链接:https://pan.baidu.com/s/1lN8C7TDFjSV ...

  5. IO 函数

    http://www.cnblogs.com/orange1438/p/4613460.html

  6. 转: memcached Java客户端spymemcached的一致性Hash算法

    转自:http://colobu.com/2015/04/13/consistent-hash-algorithm-in-java-memcached-client/ memcached Java客户 ...

  7. Netty3 源代码分析 - NIO server绑定过程分析

    Netty3 源代码分析 - NIO server绑定过程分析      一个框架封装的越好,越利于我们高速的coding.可是却掩盖了非常多的细节和原理.可是源代码可以揭示一切. 服务器端代码在指定 ...

  8. Ubuntu下编译Android JNI实例全过程

    第一步:保证make和gcc可用 在shell中输入make-v.不报错就是对的.(可參考http://wenku.baidu.com/view/d87586c24028915f804dc24a.ht ...

  9. C#语法复习2

    第五章 方法 1.方法是一块具有名称的代码 包括:方法体.方法头 局部变量必须被赋值才可以执行下面的操作.实例变量有隐式初始化.有时候,类型推断可以用var关键字,类似于C++当中的auto.用于局部 ...

  10. 【转载】lvs为何不能完全替代DNS轮询

    上一篇文章"一分钟了解负载均衡的一切"引起了不少同学的关注,评论中大家争论的比较多的一个技术点是接入层负载均衡技术,部分同学持这样的观点: 1)nginx前端加入lvs和keepa ...