资源描述:
《书写优雅的shell脚本-if语句》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、书写优雅的shell脚本(一)-if语句 使用unix/linux的程序人员几乎都写过shell脚本,但这其中很多人都是为了完成功能而在网上找代码段,这样写出来的shell脚本在功能方面当然是没有什么问题,但是这样的方式不能写出优雅的shell脚本。 从今天开始,starfe就将自己平时在书写shell脚本过程中的经历做一总结,力图形成一个系列---“书写优雅的shell脚本”。 在此,对“优雅”一词的定义有4点:(1)健壮;(2)结构清晰;(3)性能好;(4)力求简单。 好了,废话不多说,开始今天的主题:if语句 1.if判断式 (1) if[条件判断一]&&(
2、
3、)[条
4、件判断二];then xxx fi (2) if[条件判断一]&&(
5、
6、)[条件判断二];then xxx else xxx fi (3) if[条件判断一]&&(
7、
8、)[条件判断二];then xxx elif[条件判断三]&&(
9、
10、)[条件判断四];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
11、] -le小于等于,如:if[$a-le$b] >大于,如:[$a>$b] >=大于等于,如:[$a>=$b] 注:以上其实不是健壮的代码,上面这些代码在有些情况下会存现错误提示,而真正健壮的是使用双括号来表示,即if[[$a-eq$b]] 这是为何?做个测试如下: $>a=;b=3; $>if[a-gt$b];thenecho"true";fi -bash:[:-gt:unaryoperatorexpected//报错 而改为$>if[[a>3]];thenecho"true";fi//不再报错,这也是我们所期望的 究其原因,是因为如果变量a值为空(由于shell是
12、弱类型语言,对变量赋值都是当字符串对待),那么就成了[-gt3],显然[和$b不相等并且缺少了[符号,所以报了这样的错误。当然不总是出错,如果变量a值不为空,程序就正常了,所以这样的错误还是很隐蔽的。 或者用下面的方法也能避免这种错误:if["$a"x-gt"$b"x];thenecho"true";fi。当然,x也可以是其他字符。新濠天地娱乐城66bb.org顺便提一点,shell中有没有双引号在很多情况下是一致的。 2.2字符串比较 等于,如:if[$a=$b]或if[$a==$b],与=等价 不等于,如:if[$a!=$b] 大于,在ASCII字母顺序下.如:if[$a
13、>$b] 小于,在ASCII字母顺序下.如:if[$a<$b]注意:要使用转义符“”。 2.3文件比较 [ 文件1-nt文件2]为真如果文件1hasbeenchangedmorerecentlythan文件2,or如果文件1存在而且文件2 doesnot。 [文件1-ot文件2]为真如果文件1比文件2旧,或者文件2存在而且 文件1不存在。 [文件1-ef文件2]为真如果文件1而且文件2refertothe samedevice而且inodenumbers。 2.4表达式比较 [表达式1 -a表达式2]如果表达式1而且表达式2同时为真则为真。 [表达式1-o表
14、达式2]如果表达式1或者表达式2其中之一为真则为真。 3.if中的一元比较 [-a文件]如果文件存在为真。 [-b文件]如果文件存在而且是一个块-特殊文件为真。 [-c文件]为真如果文件存在而且是一个字-特殊文件。 [-d文件]为真如果文件存在而且是一个目录。 [-e文件]为真如果文件存在。 [-f文件]为真如果文件存在而且是一个普通文件。 [-g文件]为真如果文件存在而且已经设置了他的SGID位。 [-h文件]为真如果文件存在而且是一个符号连接。 [-k文件]为真如果文件存在而且他的粘住位已经设置。 [-p文件]为真如果文件存在而且是一个已经命名的管道(F如果O)
15、。 [-r文件]为真如果文件存在而且是可读的。 [-s文件]为真如果文件存在而且比零字节大。 [-tFD]为真如果文件文件描述符已经打开而且指向一个终端。 [-u文件]为真如果文件存在而且已经设置了他的SUID(setuserID)位。 [-w文件]为真如果文件为真如果文件存在而且是可写的。 [-x文件]为真如果文件存在而且是可执行的。 [-O文件]为真如果文件存在而且属于有效用户ID。 [-G文件]为真如果文件存在