Sunday, September 5, 2010

linux shell学习笔记(二)

2010-07-25 by zhiwei  

精彩推荐

接上篇日志:linux shell学习笔记(一)

这篇日志主要写shell中的控制语句,有两种判断语句,if语句和case语句,学过C语言的同学一定不会陌生,很简单的用法。

七、shell中的控制判断语句

1. if语句

原型一

1
2
3
if 测试条件
then 语句1
fi

原型二

1
2
3
4
if 测试条件
then 语句1
else 语句2
fi

原型三

1
2
3
4
5
6
if 测试条件1
then 语句1
elif 测试条件2
then 语句2
else 语句3
fi

在if语句中一个重要的环节是编写测试条件,也就是程序执行的判断条件。if语句中可以将命令执行结果当作测试条件。例如:若命令正常结束,则表示测试成功,其返回值为0,条件测试为真;否则条件测试为假。测试条件编写一般有以下3种形式:

(1). 用test命令

(2). 用方括号把测试条件括起来。

(3). 采用[[条件表达式]]方式,条件表达式用来测试文件的属性和进行字符串比较。

test命令原型如下:

test 表达式

test一般与系统运算搭配起来使用,它可以与如下四类运算符共同使用。

第一类:字符测试运算符

字符测试运算符的作用是用于测试字符串操作的返回值,具体参数如下:

-z str1 :如果字符串str1的长度为0,则测试条件为真
-n str1 :如果字符串str1的长度大于0,则测试条件为真
str1       :如果字符串str1不是空串,则测试条件为真
str1 = str2 :如果字符串str1等于字符串str2,则测试条件为真
str1 != str2 :如果字符串str1不等于字符串str2,则测试条件为真
str1 > str2 :如果按字典顺序字符串str1排在str2之后,则测试条件为真
str1 < str2 :如果按字典顺序字符串str1排在str2之前,则测试条件为真

注:=、!=、<、>,这些符号在使用时两边要加空格

例:

1
2
3
4
5
6
7
8
9
#!/bin/bash
echo "input your address:"
read address
if address
then
	echo "your address is: "$address
else
	echo "your address is null"
fi

以上程序意思是用户输入一字符串,如果输入字符串长度大于0,则输出用户输入的字符串,否则输出空。

第二类:数值测试运算符

数值测试运算符主要用于数值运算时的判断,具体参数如下:

num1 -eq num2 :如果整数num1等于num2,则测试条件为真
num1 -ne num2 :如果整数num1不等于num2,则测试条件为真
num1 -lt num2 :如果整数num1小于num2,则测试条件为真
num1 -le num2 :如果整数num1小于或等于num2,则测试条件为真
num1 -gt num2 :如果整数num1大于num2,则测试条件为真
num1 -ge num2 :如果整数num1大于或等于num2,则测试条件为真

第三类:逻辑运算符

逻辑运算符用于逻辑语句的判断,常用的逻辑运算符如下:

! :逻辑“非”,放在任意逻辑表达式的前面,全原来为真的表达式为假,原来为假的表达式为真
-a :逻辑“与”,放在两个逻辑表达式之间,表示只有两个表达式都为真时,结果才为真
-o :逻辑“或”,放在两个逻辑表达式之间,表示只有两个表达式都为假时,结果才为假
() :圆括号可以把逻辑表达式括起来,使用之成为一个整体,优先进行运算

注:逻辑表达式中运算符的优先关系如下:”()”>”!”>”-a”>”-o”。

第四类:文件运算符

文件运算符用于测试文件或目录的操作,常用文件运算符如下:

-r 文件名:若文件存在并且是用户可读的,则测试条件为真
-w 文件名:若文件存在并且是用户可写的,则测试条件为真
-x 文件名:若文件存在并且是用户可执行的,则测试条件为真
-f  文件名:若文件存在并且是普通文件,则测试条件为真
-d 文件名:若文件存在并且是目录文件,则测试条件为真
-p 文件名:若文件存在并且是命名的FIFO文件,则测试条件为真
-b 文件名:若文件存在并且是块设备文件,则测试条件为真
-c 文件名:若文件存在并且是字符设备文件,则测试条件为真
-s 文件名:若文件存在并且长度大于0,则测试条件为真
-t 文件描述字:若文件被打开并且文件描述字是与终端设备相关的,则测试条件为真,默认的文件描述字是1。

2. case语句

case语句是一种多重判断语句,类似于多个if elif语句,其原型如下:

1
2
3
4
5
6
case 字符串 in
	模式表达式1) 语句1;;
	模式表达式2) 语句2;;
	模式表达式3) 语句3;;
	...
esac

case语句执行原理是将字符串与各个模式串顺次匹配,若满足则执行,否则继续查找,如果没有匹配成功的,则不执行任何语句,直接退出。

注:每个模式处理语句是以”;;”两个分号结束的,模式表达式应该唯一,一个模式表达式可以含有多个模式串,但它们之间要用”|”隔开。

例:

© 2010, chenzhiwei.net. 版权所有.
本文永久链接:http://chenzhiwei.net/2010/07/linux-shell-study-notes-part-2/
本文短网址:http://chenzhiwei.net/?p=30318

Comments

One Response to “linux shell学习笔记(二)”
  1. dengmin 说:

    又来了,补充一下 if语句 在[] 中的条件 两边都要有空格 if [ -z $str ]

Speak Your Mind