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

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

我们可修改一下前面的my.sh,使之内容如下:

#!/bin/bash
my_fun() {
echo "$#"
}
echo 'the number of parameter in "$@" is '$(my_fun "$@")
echo 'the number of parameter in "$*" is '$(my_fun "$*")

然后再执行./my.sh p1 "p2 p3" p4就知道$@与$*差在哪了…^_^

the number of parameter in "$@" is 3
the number of parameter in "$*" is 1

第10问:&& 與 || 差在哪?
好不容易,进入两位数的章节了…一路走来,很辛苦吧?也很快乐吧?^_^ 在解答本章题目之前,先让我们了解一个概念:return value!

我们在shell下跑的每一个command或function,在结束的时候都会传回父行程一个值,称为return value。在shell command line中可用$?这个变量得到最"新"的一个return value,也就是刚结束的那个行程传回的值。Return Value(RV)的取值为0-255之间,由程序(或script)的作者自行定议:

若在script里,用exit RV来指定其值,若没指定,在结束时以最后一道命令之RV为值。
若在function里,则用return RV来代替exit RV即可。
Return Value的作用,是用来判断行程的退出状态(exit status),只有两种:

0的话为“真”(true) 非0的话为“假”(false)

举个例子来说明好了:假设当前目录内有一份my.file的文件,而no.file是不存在的:

$ touch my.file
$ ls my.file
$ echo $? # first echo
0
$ ls no.file
ls: no.file: No such file or directory
$ echo $? # second echo
1
$ echo $? # third echo
0

上例的第一个echo是关于ls my.file的RV,可得到0的值,因此为true;第二个echo是关于ls no.file的RV,则得到非0的值,因此为false;第三个echo是关于第二个echo $?的RV,为0的值,因此也为true。

请记住:每一个command在结束时都会送回return value的! 不管你跑甚么样的命令…然而,有一个命令却是"专门"用来测试某一条件而送出return value以供true或false的判断,它就是test命令了!

若你用的是bash,请在command line下打man test或man bash来了解这个test的用法。这是你可用作参考的最精确的文件了,要是听别人说的,仅作参考就好…下面我只简单作一些辅助说明,其余的一律以man为准:

首先,test的表示式我们称为expression,其命令格式有两种:

test expression 
or:
[ expression ]

(请务必注意[ ]之间的空白键﹗)

用哪一种格式没所谓,都是一样的效果。(我个人比较喜欢后者…)其次,bash的test目前支持的测试对像只有三种:

string:字串,也就是纯文字。
integer:整数(0或正整数,不含负数或小数点)。
file:文件。
请初学者一定要搞清楚这三者的差异,因为test所用的expression是不一样的。