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

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

${A[@]}或${A[*]} # 可得到a b c def(全部组数) ${A[0]} # 可得到a(第一个组数),${A[1]}则为第二个组数… ${#A[@]}或${#A[*]} #可得到4(全部组数数量) ${#A[0]} #可得到1(即第一个组数(a)的长度),${#A[3]}可得到3(第四个组数(def)的长度) A[3]=xyz # 则是将第四个组数重新定义为xyz… 能够善用bash的$()与${}可大大提高及简化shell在变量上的处理能力哦~~~ ^_^

好了,最后为大家介绍$(())的用途吧:它是用来作整数运算的。在bash中,$(())的整数运算符号大致有这些:+ - * /:分别为“加、减、乘、除”。%:余数运算。& | ^!:分别为“AND、OR、XOR、NOT”运算。

例:

$ a=5;b=7;c=2
$ echo $((a+b*c))
19
$ echo $(((a+b)/c))
6
$ echo $(((a*b)%c))
1

在$(())中的变量名称,可于其前面加$符号来替换,也可以不用,如:
$(($a + $b * $c))也可得到19的结果

此外,$(())还可作不同进位(如二进位、八进位、十六进位)作运算呢,只是,输出结果皆为十进制而已:

echo $((16#2a)) # 结果为42(16进位转十进制)
以一个实用的例子来看看吧:假如当前的umask是022,那么新建文件的权限即为:

$ umask 022
$ echo "obase=8;$((8#666 & (8#777 ^ 8#$(umask))))" | bc
644

事实上,单纯用(())也可重定义变量值,或作testing:

a=5;((a++)) #可将$a重定义为6
a=5;((a--)) 则为a=4
a=5;b=7;((a < b)) 会得到0(true)的返回值。

常见的用于(())的测试符号有如下这些:

<:小于 >:大于 <=:小于或等于 >=:大于或等于 ==:等于 !=:不等于

不过,使用(())作整数测试时,请不要跟[ ]的整数测试搞混乱了。(更多的测试我将于第十章为大家介绍)怎样?好玩吧..^_^ okay,这次暂时说这么多…

上面的介绍,并没有详列每一种可用的状态,更多的,就请读者参考手册文件啰…

第9问:$@ 與 $* 差在哪?
要说$@与$*之前,需得先从shell script的positional parameter谈起…

我们都已经知道变量(variable)是如何定义及替换的,这个不用再多讲了。但是,我们还需要知道有些变量是shell内定的,且其名称是我们不能随意修改的,其中就有positional parameter在内。在shell script中,我们可用$0,$1,$2,$3…这样的变量分别提取命令行中的如下部份:

script_name parameter1 parameter2 parameter3…

我们很容易就能猜出$0就是代表shell script名称(路径)本身,而$1就是其后的第一个参数,如此类推… 须得留意的是IFS的作用,也就是,若IFS被quoting处理后,那么positional parameter也会改变。如下例:

my.sh p1 "p2 p3" p4