linux中中括号和小括号都是命令,中括号是test命令,小括号是将命令放入子shell执行
双小括号
1.扩展for
[root@hadoop Desktop]# for((i=0;i<4;i++));do echo 'weihongrao'; done
weihongrao
weihongrao
weihongrao
weihongrao
2.扩展while
[root@hadoop Desktop]# i=0
[root@hadoop Desktop]# max=5
[root@hadoop Desktop]# while((i0
1
2
3
4
3.扩展if
[root@hadoop Desktop]# if((4>2));then echo 'yes';fi
yes
[root@hadoop Desktop]# if((5>4&&7<8));then echo 'yes';fi
yes
hongrao:~ hongraowei$ m=07;d=14;if (($m==07&&$d==15))||((5==5));then echo 'yes';else echo 'no';fi
yes
4. 进行四则运算
[root@hadoop Desktop]# a=0
[root@hadoop Desktop]# b=10
[root@hadoop Desktop]# ((a=a+1,b=b+1))
[root@hadoop Desktop]# echo $a,$b
1,11
以上可以看出双小括号中可以进行四则运算并调用和返回值到主体,并且双小括号中不必引入$在变量前面,但是双小括号也可以使用$
如果要 把双小括号的运算结果返回给shell中的变量则需要在双小括号前面加入$
[root@hadoop Desktop]# a=10
[root@hadoop Desktop]# b=$((1+a))
[root@hadoop Desktop]# echo $b
5. 双中括号中可以使用&& || > < 等操作符号,但是在[ ]中是不允许的,但是所有的操作符号和变量或者常量间必须要有空格否则会报错,以下是正确的,if和[[之间,6和 >之间都是有空格的。需要注意[[ ]] 中貌似不支持>= 和<= 可以用(())代替
[root@hadoop Desktop]# if [[ 6 > 5 || 6 > 9 ]]; then echo 'yes';fi
另外注意,双中括号和中括号一样引用变量是需要替换(加$),但是在双小括号中就不用
[root@hadoop lib]# a=3
[root@hadoop lib]# b=5
[root@hadoop lib]# if [[ ${a} > 1 && ${b} < 9 ]];then echo "yes";else echo "no";fi
yes
6.中括号是test命令,里面要用>
[root@hadoop Desktop]# if [ 6 \> 5 ]; then echo 'yes'; else echo 'no';fi
yes
7 小括号
最为命令组使用,将括号内的命令在子shell执行并且里面的变量不能被外层的shell引用
[root@hadoop Desktop]# (ii=10;echo $ii);echo $ii
10
[root@hadoop Desktop]#
以上可以看到外层的ii是没有定义的
小括号作为命令替换,前面加上$,并将执行结果返回到外层shell
[root@hadoop Desktop]# a=$(date)
[root@hadoop Desktop]# echo $a
Thu Nov 28 02:55:43 EST 2013
[root@hadoop Desktop]# for i in $(ls); do echo $i;done
2.txt
5
9]]
a
a~
business2.txt
business.txt
derby.log
exlipse-hadoop.jar
fact9.csv
go.sh
小括号同时也作为shell数组初始化
[root@hadoop Desktop]# a=(1 2 3 4 5)
[root@hadoop Desktop]# for i in ${a[@]}; do echo $i ;done
1
2
3
4
5
[root@hadoop Desktop]# for i in ${a}; do echo $i ;done
1
注意的是虽然最为四则运算的测试时双小括号和双中括号是一样的效果但是在其他的时候两者不是可以相互替代的,比如双小括号扩展了for和while循环,但是双中括号却没有相应的扩展,而在双中括号中可以测试一个文件是否存在或者一个变量是否是空 如:
[root@hadoop Desktop]# if [[ -z ${oo} ]];then echo 'yes null' ; else echo 'not null' ;fi
yes null
但是就不能再双小括号中实现
另外 双中括号和双小括号也有计算上的区别,如
hongrao:~ hongraowei$ m=07;if [[ $m == 7 ]];then echo 'yes'; else echo 'no';fi
no
hongrao:~ hongraowei$ m=07;if (( $m == 7 ));then echo 'yes'; else echo 'no';fi
yes
如此可见,双小括号是基于数字的运算,但是双中括号更像是基于字符的
补充:test 和中括号
test 的另一种形式就是中括号,需要注意的是
1. 在shell中单独test 命令,需要用$?来获取返回结果
2. test 和中括号中使用比较符号等需要加空格否则会得到相反的结果,如以下
[root@hadoop ~]# if test "you"="yous"; then echo "equel";else echo "not equel";fi
equel
[root@hadoop ~]# if test "you" = "yous"; then echo "equel";else echo "not equel";fi
not equel
[root@hadoop ~]# test "you" = "yous"
[root@hadoop ~]# echo $?
1
[root@hadoop ~]# test "you"="yous"
[root@hadoop ~]# echo $?
0