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

 

七、shell中的控制判断语句

1. if语句

原型一

if 测试条件
then 语句1                                
fi

原型二

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

原型三

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之前,则测试条件为真

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

例:

#!/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语句,其原型如下:

 

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

 

 

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

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

例:

 

八、shell中的循环语句

shell中的循环语句有for循环语句、while循环语句和until循环语句。

1. for循环语句

原型一:

for 变量 in 取值集合
for 变量 in 取值集合
do
	语句                                 
done

原型二:

for 变量 in 文件正则表达式
do
	语句                                  
done

原型三:

for 变量 in $*
do
	语句
done          

例:

#!/bin/bash

address=(beijing tianjin shandong)
for i in ${address[*]}
do                                                       
	echo $i
done

 

 

说明:
循环输出数组中的值。

2. while循环语句

原型:

while 条件测试语句
do
	语句
done  

while语句的执行过程是:先测试测试语句是否为真,若为真则执行循环体,当执行完当前命令后,再进行条件测试,直到条件结果为假,循环结束。条件测试语句既可以是test语句也可以是运行命令的返回值,若返回值大于0,则表示条件为真,否则条件为假。

例:

#!/bin/bash
str=""
echo "input a str:"
read str
while [ $str != "quit" ]
do
	echo "your input is :"$str
	echo "input your str:"
	read str                                                  
done

 

说明:

3. until循环语句

until语句是while语句的一种变形,原型如下:

until 条件测试语句  do 	        语句                                       done

 

 

如果条件为假则执行,否则不执行。

另外还有以下语句和循环语句合用。

①、break语句

break语句是一个退出循环的命令,主要用于多层循环的嵌套退出,一般用法如下:

break [n]

其中,n用来表示跳出几层循环,默认值为1,即退出本次循环。

②、continue语句

continue语句与break语句有相同之处,都用于终止本次循环,区别在于,bread语句是退出整个循环而continue语句只是退出本次循环,继续执行下一循环体。continue语句原型如下:

continue [n]

其中,n用来表示跳出几层循环,默认值为1,即退出本次循环。

③exit语句

exit语句是退出正在执行的shell脚本,可以主动指定返回值,其原型如下:

exit [n]

其中,n是主动设定的返回值。如果未显示给定n的值,则该值默认为最后一次命令的执行状态作为返回值。

 

九、linux中的函数

函数代表一种模块化的设计思想,可以将一些常用的、内聚度高的操作封装成函数,在需要时进行调用。

1. 函数原型

function 函数名()   { 	  语句   }

 

在此,function可以不显示指定。函数应先定义后使用,在调用时只需指定函数名即可,不用写()。

示例:

#!/bin/bash
function printAddress()
{
	echo "your address is: beijing"
}
printAddress

 

2. 函数的参数和返回值

在shell函数中,有两种方法使用参数:一种是变量直接传递法,另一种采用位置参数。

变量直接传递法是通过直接在外部声明变量,在函数体里面通过操作这些变量,达到向函数传递参数的目的。

例如:

#!/bin/bash
address="beijing"
function printAddress()
{
	echo "your address_1 is: "$address
	address="shanghai"
	echo "your address_2 is: "$address
}
printAddress
echo "your address_3 is: "$address

 

由此可见,函数中进行变量修改也作全局使用,所以可以通过在函数中修改参数变量来达到函数返回目的,将这些参数作为返回值。

通过下面的例子可以更好的了解位置参数:

#!/bin/bash
function printAddress()
{
	echo $1
	echo $2
}
printAddress "beijing" "shanghai"

 

注:以前学习shell时写的笔记,没有拿到电脑前练习过。这次写在博客上的这些都是我在电脑上(ubuntu8.04)练习通过后贴出来的,单引号和双引号类似于php中的单引号和双引号的用法,在用echo进行标准输出时,如果不涉及变量的话双引号、单引号都是可有可无的,还有那个数组赋值与遍历也是让我琢磨不透,所以这些细微差别还是日后慢慢的在实践中掌握比较好。