Shell (三)

$( )与${ }:

在bash shell中,$( )与` ` (反引号)都是用来做命令替换用(command substitution)的。所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行,完成引号里的命令行,然后将其结果替换出来,再重组命令行。

例如:

$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)

如此便可方便得到上一星期天的日期了…上例是在linux下,在FreeBSD下应该用下面的:

echo the last Sunday is `date ¨Cv Sunday +%Y%m%d`

在操作上,用$( )或` `都无所谓,只是我”个人”比较喜欢用$( ),理由是:

1. ` `很容易与’ ‘ (单引号)搞混乱,尤其对初学者来说。有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。当然了,有经验的朋友还是一眼就能分辩两者。只是,若能更好的避免混乱,又何乐不为呢?

2. 在多层次的复合替换中,` `须要额外的跳脱( \` )处理,而$( )则比较直观。例如:这是错的:

command1 `command2 `command3` `

原本的意图是要在command2 `command3`先将command3提换出来给command 2处理,然后再将结果传给command1`command2 …`来处理。然而,真正的结果在命令行中却是分成了`command2 `与“两段。

正确的输入应该如下:

command1 `command2 \`command3\` `

要不然,换成$( )就没问题了:

command1 $(command2 $(command3))

只要你喜欢,做多少层的替换都没问题啦~~~ ^_^不过,$( )并不是没有弊端的…首先,` `基本上可用在全部的unix shell中使用,若写成shell script,其移植性比较高。而$( )并不见的每一种shell都能使用,我只能跟你说,若你用bash2的话,肯定没问题…

接下来,再让我们看${ }吧…它其实就是用来作变量替换用的啦。一般情况下,$var与${var}并没有啥不一样。但是用${ }会比较精确的界定变量名称的范围,比方说:

$ A=B
$ echo $AB

原本是打算先将$A的结果替换出来,然后再补一个B字母于其后,但在命令行上,真正的结果却是只会替换变量名称为AB的值出来…若使用${ }就没问题了:

$ echo ${A}B
BB

不过,假如你只看到${ }只能用来界定变量名称的话,那你就实在太小看bash了。

一般而言,A=”a b c def”这样的变量只是将$A替换为一个单一的字符串,但是改为A=(a b c def),则是将$A定义为组数…

bash的组数替换方法可参考如下方法:

${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的结果。

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

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

1 week ago, this page was being read.

,

Subscribe to Comments