Linux中小括号()和大括号{}都是对其中的一串命令进行执行,但有一定的区别,其区别如下:
1 小括号()
①命令组。括号中的命令新开一个子shell程序,括号中的变量为本地变量 ,不能够在脚本其他部分使用。括号中多个命令之间用分号隔开。
备注:
在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的.
父进程, 也就是脚本本身, 将不能够读取在子进程中创建的变量, 也就是在子shell中创建的变量.
(cmd1;cmd2;cmd3)
②命令替换。命令替换$(cmd)等同于`cmd`(这不是单引号,`是ESC下面的那个键) ,shell执行过程中发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其输出,再将此输出放到原来命令。例如:
[root@localhost tmp]# ls
fstab functions hellobash issue mytestdir scripts
[root@localhost tmp]# echo $(ls)
fstab functions hellobash issue mytestdir scripts
[root@localhost tmp]# echo `ls`
fstab functions hellobash issue mytestdir scripts
[root@localhost tmp]#
③用于初始化数组。如:arr=(m n)
2 大括号
①拓展。对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。拓展分为普通以逗号(,)进行拓展,如echo {a,b}.txt将间隔的各项内容均列出;已两个点(..)进行拓展,如echo {1..5}.txt自动补全1到5中间内容。
[root@localhost ~]# echo {a,b}.txt
a.txt b.txt
[root@localhost ~]# echo {1..5}.txt
1.txt 2.txt 3.txt 4.txt 5.txt
[root@localhost ~]#
②内部组 。与小括号中的命令不同,大括号内的命令在当前shell运行,不会重新开子shell。
括号内的命令间用分号隔开,最后一个命令后必须跟分号。{}的第一个命令和左括号之间必须要有一个空格。
3 (( ))
(( ... ))结构可以用来计算并测试算术表达式的结果. 退出状态将会与[ ... ]结构完全相反!还可应用到c风格的for,while循环语句,(( )) 中,所有的变量(加不加$无所谓)都是数值。
$((...))结构的表达式是C风格的表达式,其返回的结果是表达式值,其中变量引用可不用‘$’(当然也可以)
for((...;...;...))
do
cmd
done
while ((...))
do
cmd
done
比较操作符
<
小于
(("$a" < "$b"))
<=
小于等于
(("$a" <= "$b"))
>
大于
(("$a" > "$b"))
>=
大于等于
(("$a" >= "$b"))
(( 0 ))
echo "Exit status of `(( 0 ))` is $?." # 1
(( 1 ))
echo "Exit status of `(( 1 ))` is $?." # 0
(( 5 > 4 )) # 真
echo "Exit status of `(( 5 > 4 ))` is $?." # 0
(( 5 > 9 )) # 假
echo "Exit status of `(( 5 > 9 ))` is $?." # 1
(( 5 - 5 )) # 0
echo "Exit status of `(( 5 - 5 ))` is $?." # 1
(( 5 / 4 )) # 除法也可以.
echo "Exit status of `(( 5 / 4 ))` is $?." # 0
(( 1 / 2 )) # 除法的计算结果 < 1.
echo "Exit status of `(( 1 / 2 ))` is $?." # 截取之后的结果为 0.
# 1
or ((a=1; a <= LIMIT ; a++)) # 双圆括号, 并且"LIMIT"变量前面没有"$".
do
echo -n "$a "
done
while (( a <= LIMIT )) # 双圆括号, 变量前边没有"$".
do
echo -n "$a "
((a += 1)) # let "a+=1"
done
a=2
b=$(($a*4)) #a=2 b=8
c=$((a*3)) #a=2 c=6
总结:
()会开启一个新的子shell,{}不会开启一个新的子shell
(())常用于算术运算比较,[[]]常用于字符串的比较.
$()返回括号中命令执行的结果
$(())返回的结果是括号中表达式值
${ }参数替换与扩展
本文转自:
http://blog.csdn.net/damotiansheng/article/details/44196769
https://jingyan.baidu.com/article/676629977eddbb54d41b8454.html