Linux系统中bash shell编程的10个基础问题讲解

2019-09-23 09:20:30王振洲

以A=123这个变量为例:

[ "$A" = 123 ] # 是字串的测试,以测试$A是否为1、2、3这三个连续的“文字”。
[ "A" -eq 123 ] # 是整数的测试,以测试$A是否等于“一百二十三”。
[ -e "$A" ]  # 是关于文件的测试,以测试123这份“文件”是否存在。

第三,当expression测试为“真”时,test就送回0(true)的return value,否则送出非0(false)。若在expression之前加上一个!(感叹号),则是当expression为“假时”才送出0,否则送出非0。

同时,test也允许多重的复合测试:

expression1 -a expression2 # 当两个exrepssion都为true,才送出0,否则送出非0。
expression1 -o expression2 # 只需其中一个exrepssion为true,就送出0,只有两者都为false才送出非0。

例如:

[ -d "$file" -a -x "$file" ]

是表示当$file是一个目录、且同时具有x权限时,test才会为true。

第四,在command line中使用test时,请别忘记命令行的“重组”特性,也就是在碰到meta时会先处理meta再重新组建命令行。(这个特性我在第二及第四章都曾反复强调过)比方说,若test碰到变量或命令替换时,若不能满足expression格式时,将会得到语法错误的结果。举例来说好了:关于[ string1 = string2 ]这个test格式,在=号两边必须要有字串,其中包括空(null)字串(可用soft quote或hard quote取得)。

假如$A目前没有定义,或被定议为空字串的话,那如下的写法将会失败:

$ unset A
$ [ $A = abc ]
[:=:unary operator expected

这是因为命令行碰到$这个meta时,会替换$A的值,然后再重组命令行,那就变成了:[ = abc ]

如此一来=号左边就没有字串存在了,因此造成test的语法错误﹗但是,下面这个写法则是成立的:

$ [ "$A" = abc ]
$ echo $?
1

这是因为在命令行重组后的结果为:[ "" = abc ]。由于=左边我们用soft quote得到一个空字串,而让test语法得以通过…读者诸君请务必留意这些细节哦,因为稍一不慎,将会导至test的结果变了个样!

若您对test还不是很有经验的话,那在使用test时不妨先采用如下这一个"法则":

假如在test中碰到变量替换,用soft quote是最保险的﹗若你对quoting不熟的话,请重新温习第四章的内容吧…^_^
okay,关于更多的test用法,老话一句:请看man page吧!^_^ 虽然洋洋洒洒讲了一大堆,或许你还在嘀咕….那…那个return value有啥用啊?!问得好﹗

告诉你:return value的作用可大了﹗若你想让你的shell变“聪明”的话,就全靠它了:

有了return value,我们可以让shell跟据不同的状态做不同的时情…
这时候,才让我来揭晓本章的答案吧~~~ ^_^ && 与 || 都是用来“组建”多个command line用的: