一、双圆括号,即((...))
作用1:使变量执行算术运算
#!/bin/bash
a=10
b=20
c=$((a*b))
echo "c=$c"
[root@nn ~]# ./test.sh
c=200
作用2:使bash shell 实现C语言风格的变量操作,包含5种
1.首先是C语言风格的赋值,C语言允许赋值号两端存在空格,但是在shell中是不允许的 ((a = 2000))
2.其次,变量 可以使用C语言中的自增、自减 ((a++)) ((a--)) ((++a))
3.可以用于for,while,if中的条件测试
4.支持多个表达式运算,各个表达式之间用“,”分开
5.可以进行四则运算和逻辑运算
二、单圆括号 (...)
作用1:强制将()中的命令运行在子shell中
(
command 1
command 2
....
)
括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
[root@nn shell]# cat subsvar.sh
#!/bin/bash
echo "The level of father shell is : $BASH_SUBSHELL"
outervar=OUTER
(#进入子shell
echo "The level of son shell is :$BASH_SUBSHELL"
innervar=INNER
echo "innervar=$innervar"
echo "outervar=$outervar"
)
#回到父shell
echo "The level of father shell is : $BASH_SUBSHELL"
if [ -z "$innervar" ]
then
echo "The \$innervar is not defined in main body"
else
echo "The \$innervar is defined in main body"
fi
运行结果: [root@nn shell]# ./subsvar.sh
The level of father shell is : 0
The level of son shell is :1
innervar=INNER
outervar=OUTER
The level of father shell is : 0
The $innervar is not defined in main body
作用2:命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh
a=$(ls /root) 等价于 a=`ls /root` #一定要找个变量接一下 ,它与直接执行 ls /root 不一样;$() 与`` 都是将结果保存起来
echo $a
作用3:用于初始化数组 如:array=(a b c d)
#!/bin/bash
city=(nanjing beijing jinan zibo linyi)
echo "city[0]=${city[0]}"
echo "city[1]=${city[1]}"
echo "city[2]=${city[2]}"
echo "city[3]=${city[3]}"
echo "city[4]=${city[4]}"
echo "city[5]=${city[5]}"
~
~
~
~
运行结果:~
[root@nn shell]# chmod +x arry1.sh
[root@nn shell]# ./arry1.sh
city[0]=nanjing
city[1]=beijing
city[2]=jinan
city[3]=zibo
city[4]=linyi
city[5]=
#!/bin/bash
city=(nanjing [3]=beijing jinan zibo linyi) //()可以给任意一个元素随机赋值
echo "city[0]=${city[0]}"
echo "city[1]=${city[1]}"
echo "city[2]=${city[2]}"
echo "city[3]=${city[3]}"
echo "city[4]=${city[4]}"
echo "city[5]=${city[5]}"
~
运行结果:
~[root@nn shell]# ./arry1.sh
city[0]=nanjing
city[1]=
city[2]=
city[3]=beijing
city[4]=jinan
city[5]=zibo
~