这篇日志主要写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进行标准输出时,如果不涉及变量的话双引号、单引号都是可有可无的,还有那个数组赋值与遍历也是让我琢磨不透,所以这些细微差别还是日后慢慢的在实践中掌握比较好。
转载于:https://blog.51cto.com/sunyu/592869