unix/linux shell,Unix/Linux Shell编程(4)

命令执行操作符

◆多条命令可以在一行中出现。它们可以从左到右顺序执行。此时,各条命令之间应以分号( ;)隔开,如:

pwd ; who | wc -l ; cd /usr/bin

◆在相邻命令间可存在逻辑关系,即逻辑“与”和逻辑“或”。 逻辑与操作符“&&”可把两个命令联系在一起,其一般形式:

命令1 && 命令2

其功能是先执行命令1,如果执行成功,才执行命令2;否则,若命令1执行不成功,则不执行命令2。例如:

cp ex1 ex10 && rm ex1

如果成功地把文件ex1拷贝到文件ex10中,则把ex1删除。 逻辑或操作符“||”可把两个命令联系起来,其一般形式是:

命令1 || 命令2

其功能是先执行命令1,如果执行不成功,则执行命令2;否则,若命令1执行成功,则不执行命令2。例如:

cat abc || pwd

如果不能将文件abc的内容列出来,则显示当前工作目录的路径。 ◆在Shell中有两种方式可以将若干命令组合在一起,使其在逻辑上被视为一条命令,它们是用花括号{ }将各命令括起来和用圆括号(

)括起来。 以花括号括起来的全部命令可视为语法上的一条命令,出现在管道符的一边。成组命令的执行顺序是根据命令出现的先后次序,由左至右执行。在管道线中,成组命令把各命令的执行结果汇集在一起,形成一个输出流,这个流作为该管道线中下一个命令的输入。例如,

{ echo "User Report for ` date ` . "; who ; } | pr

使用花括号时在格式上应注意:左括号 “{ ”后面应有一个空格;右括号“}”之前应有一个分号(

;)。 成组命令也可以用圆括号括起来。例如:

(echo "Current directory is ` pwd ` . "

cd /home/mengqc ; ls -l ;

cp m1 em1 && rm m1

cat em1) | pr

如上所示,在用圆括号括起成组命令时,左括号后不必有空格,右括号之前也不需加上分号。 二者执行过程相同,但是存在重要区别:用花括号括起来的成组命令只是在本Shell内执行命令表,不产生新的进程;而用圆括号括起来的成组命令是在新的子Shell内执行,要建立新的子进程。因此,在圆括号内的命令不会改变父Shell的变量值及工作目录等。 算术运算

bash中执行整数算术运算的命令是let,其语法格式为:

let arg …

其中,arg是单独的算术表达式。这里的算术表达式使用C语言中表达式的语法、优先级和结合性。除++、--和逗号(,)之外,所有整型运算符都得到支持。此外,还提供了方幂运算符“**”。命名的参数可以在算术表达式中直接利用名称访问,不要前面带有“$”符号。当访问命名参数时,就作为算术表达式计算它的值。算术表达式按长整数进行求值,并且不检查溢出。当然,用0作除数就产生错误。 let 命令的替代表示形式是:

((算术表达式))

例如,let ″j=i*6+2″等价于((j=i*6+2))。 如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1。 当表达式中有Shell的特殊字符时,必须用双引号将其括起来。例如,let ″val=a|b″。如果不括起来,Shell会把命令行let

val=a|b中的“|”看成管道符,将其左右两边看成不同的命令,因而无法正确执行。 控制结构 Shell具有一般高级程序设计语言所具有的控制结构和其它的复杂功能,如if语句、

case语句、循环结构、函数等。其实在Shell中,这些控制结构也称作“命令”。为了程序设计的习惯,才把它们称作语句。 1.if语句 if语句用于条件控制结构中,其一般格式为:

if 测试条件

then 命令1

else 命令2

fi

其中,if、then、else和fi是关键字。例如:

if test -f "$1"

then echo "$1 is an ordinary file . "

else echo "$1 is not an ordinary file . "

fi

应该注意,if语句中else部分可以缺省。另外,if

语句的else部分还可以是else—if结构,此时可以用关键字“elif”代替“else if”。

通常,if的测试部分是利用test命令实现的。其实,条件测试可以利用一般命令执行成功与否来作判断。如果命令正常结束,则表示执行成功,其返回值为0,条件测试为真;如果命令执行不成功,其返回值不等于0,条件测试就为假。所以if的语句的更一般形式是:

if 命令表1

then 命令表2

else 命令表3

fi

2.条件测试 条件测试有三种常用形式:一种是用test命令,如上所示。另一种是用一对方括号将测试条件括起来。这两种形式是完全等价的。例如,测试位置参数$1是否是已存在的普通文件,可写为test

-f "$1"。也可写成[ -f "$1"

]。利用一对方括号表示条件测试时,在左方括号“[”之后、右方括号“]”之前各应有一个空格。 第三种形式是:

[[条件表达式]]

test命令可以和多种系统运算符一起使用。这些运算符可以分为四类:文件测试运算符(文件的属性及权限等)、字符串测试运算符(两个串是否相同及是否为空)、数值测试运算符(大小关系)和逻辑运算符(逻辑与、或、非)。 3.case语句 case语句允许进行多重条件选择。其一般语法形式是:

case 字符串 in

模式字符串1) 命令

命令;;

模式字符串2) 命令

命令;;

模式字符串n) 命令

命令;;

esac

其执行过程是用“字符串”的值依次与各模式字符串进行比较,如果发现同某一个匹配,那么就执行该模式字符串之后的各个命令,直至遇到两个分号为止。如果没有任何模式字符串与该字符串的值相符合,则不执行任何命令。 在使用case语句时应注意:

(1)每个模式字符串后面可有一条或多条命令,其最后一条命令必须以两个分号(即;;)结束。

(2)模式字符串中可以使用通配符。

(3)

如果一个模式字符串中包含多个模式,那么各模式之间应以竖线(|)隔开,表示各模式是“或”的关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令表。

(4)各模式字符串应是惟一的,不应重复出现。并且要合理安排它们的出现顺序。例如,不应将“*”作为头一个模式字符串,因为“*”可以与任何字符串匹配,它若第一个出现,就不会再检查其它模式了。

(5)case语句以关键字case开头,以关键字esac(是case倒过来写!)结束。

(6)case的退出(返回)值是整个结构中最后执行的那个命令的退出值。若没有执行任何命令,则退出值为零。

4. while语句

Shell中有三种用于循环的语句,它们是while语句、for语句和until语句。

while语句的一般形式是:

while 测试条件

do

命令表

done

其执行过程是,先进行条件测试,如果结果为真,则进入循环体(do—done之间部分),

执行其中命令;然后再做条件测试……直至测试条件为假时才终止while语句的执行。例如:

while [ $1 ]

do

if [ -f $1 ]

then echo "display : $1 "

cat $1

else echo "$1 is not a file name . "

fi

shift

done

这段程序对各个给定的位置参数,首先判断其是否是普通文件,若是,则显示其内容;否则,显示它不是文件名的信息。每次循环处理一个位置参数$1,利用shift命令可把后续位置参数左移。 测试条件部分除使用test命令或等价的方括号外,还可以是一组命令。根据其最后一个命令的退出值决定是否进入循环体执行。 5.until语句 until语句的一般形式是:

until 测试条件

do

命令表

done

它与while语句很相似,只是测试条件不同:当测试条件为假时,才进入循环体,直至测试条件为真时终止循环。 6.for语句

for语句是最常用的建立循环结构的语句。其使用格式主要有三种,取决于循环变量的取值方式。格式一:

for 变量 in 值表

do

命令表

done

例如:

for day in Monday Wednesday Friday Sunday

do

echo $day

done

其执行过程是,变量day依次取值表中各字符串,即第一次将“Monday”赋给day,然后进入循环体,执行其中的命令,显示出Monday。第二次将“Wednesday”赋给day,然后执行循环体中命令,显示出Wednesday。依次处理,当day把值表中各字符串都取过一次之后,下面day的值就变为空串,从而结束for循环。因此,值表中字符串的个数就决定了for循环执行的次数。在格式上,值表中各字符串之间以空格隔开。 格式二:

for 变量 in 文件正则表达式

do

命令表

done

其执行过程是,变量的值依次取当前目录下(或给定目录下)与正则表达式相匹配的文件名,每取值一次,就进入循环体执行命令表,直至所有匹配的文件名取完为止,退出for循环。 格式三:

for i in $* 或者 for i

do do

命令表 命令表

done done

这两种形式是等价的。其执行过程是,变量i

依次取位置参数的值,然后执行循环体中的命令表,直至所有位置参数取完为止。 7.break命令和continue命令 break命令可以使我们从循环体中退出来。其语法格式是:

break [ n ]

其中,n表示要跳出几层循环。默认值是1,表示只跳出一层循环。 continue命令跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。其语法格式是:

continue [ n ]

其中,n表示从包含continue语句的最内层循环体向外跳到第几层循环。默认值为1。循环层数是由内向外编号。 函数

在Shell脚本中可以定义并使用函数。其定义格式为:

[function]函数名( )

{

命令表

}

其中,关键字function可以缺省。 函数应先定义,后使用。调用函数时,直接利用函数名,如showfile,不必带圆括号,就像一般命令那样使用。Shell脚本与函数间的参数传递可利用位置参数和变量直接传递。变量的值可以由Shell脚本传递给被调用的函数,而函数中所用的位置参数$1、$2,等对应于函数调用语句中的实参,这一点是与普通命令不同的。下面是使用函数的示例:

#func is a function name

# it echos the values of variables and arguments

func( )

{

echo "Let's begin now. "

echo $a $b $c

echo $1 $2 $3

echo "The end. "

}

a=" Working directory "

b="is"

c=`pwd`

func Welcome You Byby

echo "Today is ` date ` "

Shell中的函数把若干命令集合在一起,通过一个函数名加以调用。如果需要,还可被多次调用。执行函数并不创建新的进程,是通过Shell进程执行。 通常,函数中的最后一个命令执行之后,就退出被调函数。也可利用return命令立即退出函数,其语法格式是:

return [ n ]

其中,n值是退出函数时的退出值(退出状态),即$?的值。当n值缺省时,则退出值是最后一个命令执行后的退回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值