shell/bash编程中各类括号的应用

来源:互联网 发布:ubuntu 关机 编辑:程序博客网 时间:2024/06/08 17:52

转载请注明出处:

来源:作者:我为sun狂
()在子shell中运行
    (a=1);echo $a,结果是空,因为a=1不是在当前shell中运行的(a=1);(echo $a)也是空的。不在同一个子shell中数组的赋值,见最后的补充。
(())表达式计算
   a=1;((a++));echo $a,这时a就是2了。
<()和>()进程代入,可以把命令的执行结果当成文件一样读入
   比如comm前一般需要sort,那就可以这样comm <(sort 1.lst) <(sort 2.lst)
   或者是paste <(cut -t2 file1) <(cut -t1 file1)
   ,和管道差不多,但是支持多个输入。
$()$(cmd)执行cmd的结果,

    比如cmd是echo ls,那么就是执行ls,比如file $(which bash),which bash的结果是/bin/bash,

    所以file $(which bash)等于file /bin/bash。如果你$(ls),而且你的当前目录下只有a b两个文件,

    那么就是执行a b,然后系统会提示,命令没找到。
$(())表达式扩展,

    和(())很相似,但是这个是有点不同,$(())不能直接$((b++)),例如:b=1;echo $((++b))

    这时b等于2,显示的也是2,b=1; echo $((b++))这时b等于2,显示的是1.
[]和[[]][]就是 test,[]和[[]]都是条件表达式,不过[[]]有比[]高的容错性,

    如果a为空,那么[ $a -eq 0 ]会报错,但是[[ $a -eq 0 ]]不会,所以一般都会使用[[]]或者是

    [ "$a" -eq 0 ],[[]]支持的功能也比 [] 多,比如[[ aaa =~ a{3} ]],[] 还有一种用途,

    如果你的当前目录下有a1-a9九个文件,你可以用a[1-9]来替代这九个文件。

    有点需要注意,你不能用a[1-20]来代替a1- a20,必须要a[1-9] a1[0-9] a20。
$[]$(())的过去形式,

    现在已经不建议使用
{}{1..30} 就是1-30,

    或者是/{,s}bin/表示/bin/和/sbin/,ab{c,d,e}表示abc、abd、abe
${}变量的Parameter Expansion,

   用法很多,可以查看man bash。

   或者参考我之前的博文链接:
补充:()同时也是数组的赋值,比如a=(1 3 5),那么${a[0]}=1;${a[1]}=3;${a[2]}=5,

   需要注意的是,下标是从0开始的。

好了,先写这些,以后想到再补充吧。

update:2011-09-29

分享:又发现一个的``和$()的区别

                                                     author:sun&sea

23:00:45#bw_per> a=2;b=a;c=`eval echo \$$b`;echo $c
192b
23:03:35#bw_per> a=2;b=a;eval echo \$$b
2
23:03:37#bw_per> a=2;b=a;c=$(eval echo \$$b);echo $c
2
23:03:45#bw_per> a=2;b=a;c=`eval echo \\\$\$b`;echo $c
2
23:04:00#bw_per>
[root@localhost ~]#  a=2;b=a;c=`eval echo \$$b`;echo $c
+ a=2
+ b=a
++ eval echo 6051b
+++ echo 6051b
+ c=6051b
+ echo 6051b
6051b
命令解释的问题
传进去前做一次命令解析,只不过解析的结果不同
一个解析成
eval echo 6051b
一个解析成
eval echo '$a'
就是$$在``前面解析了
嗯,解释机制不同
man bash里有提到
       When the old-style backquote form of substitution is used, backslash retains its literal  meaning  except  when
       followed  by  $, ‘, or \.  The first backquote not preceded by a backslash terminates the command substitution.
       When using the $(command) form, all characters between the parentheses make up the command;  none  are  treated
       specially.
遇到\$,
``里变成\$的转义,命令解析的时候是$$b,变成了进程号加b
$()里保留了\$$b,命令解析的时候是\$$b,变成了$a了
 
这个是在读命令行时候解析时的差导~~命令替换是同一时间进行的,`` 跟$()是同样优先级的
再具体点
shell读到`或$(关健字,就会把后边的命令读进去,做一次解析,直到读到`和)关健字,把解析的结果执行一次
读进然后解析然后执行命令替换
解析时的区别


0 0
原创粉丝点击