一串的命令执行()和{}

()和{}都是对一串的命令进行执行,但有所区别

相同点

()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开

不同点

()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行
()最后一个命令可以不用分号,{}最后一个命令要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

实例 

[root@node01 ~]# var=test
[root@node01 ~]# echo $var
test
当前shell
[root@node01 ~]# (var=notest;echo $var)  开启了一个子shell
notest
[root@node01 ~]# echo $var
test
[root@node01 ~]# { var=notest;echo $var;}
notest
[root@node01 ~]# echo $var
notest
在{}中 第一个命令和{之间必须有空格,结束必须有;
{}中的修改了$var的值 说明在当前shell执行
[root@node01 ~]#  { var1=test1;var2=test2;echo $var1>a;echo $var2;}
test2
[root@node01 ~]# cat a
test1
[root@node01 ~]# (echo 1;echo 2)|awk '{print NF,$0}'
1 1
1 2

几种特殊的替换结构

${var:-string},${var:+string},${var:=string},${var:?string}
[root@node01 ~]# echo $k

[root@node01 ~]# echo ${k:-jim}
jim
[root@node01 ~]# echo $k

[root@node01 ~]# k=liujunjun
[root@node01 ~]#  echo ${k:-jim}
liujunjun
变量k为空或者未定义,则用在命令行中用jim来替换
[root@node01 ~]# unset k
[root@node01 ~]# echo $k

[root@node01 ~]# echo ${k:=jim}
jim
[root@node01 ~]# echo $k
jim
变量k为空或者未定义,则用变量k的值来替换。
[root@node01 ~]# k=ljj
[root@node01 ~]# echo $k
ljj
[root@node01 ~]# echo ${k:+jim}
jim
[root@node01 ~]# echo $k
ljj
[root@node01 ~]#  unset k
[root@node01 ~]# echo $k

[root@node01 ~]# echo ${k:+jim}

[root@node01 ~]# 
只有当k不是空的时候才替换成jim,若var为空时则不替换或者说是替换成变量k的值,即空值
[root@node01 ~]# unset k
[root@node01 ~]#  echo ${k:?jim}
-bash: k: jim
[root@node01 ~]# k=ax
[root@node01 ~]# echo ${k:?jim}
ax
[root@node01 ~]# echo ${k:-`date`}
ax
[root@node01 ~]# unset k
[root@node01 ~]# echo ${k:-`date`}
2020年 02月 05日 星期三 21:17:45 CST
[root@node01 ~]# echo ${k:-$(date)}
2020年 02月 05日 星期三 21:17:51 CST
[root@node01 ~]# b=abc
[root@node01 ~]# echo ${k:-$b}
abc
若变量var不为空,则用变量var的值来替换${var:?string}
若变量var为空,则把string输出到标准错误中,并从脚本中退出。
可利用此特性来检查是否设置了变量的值
[root@node01 ~]# echo $(3+2)
-bash: 3+2: 未找到命令

[root@node01 ~]# echo $((3+2))
5
[root@node01 ~]# echo $((3.5+2))
-bash: 3.5+2: 语法错误: 无效的算术运算符 (错误符号是 ".5+2")
[root@node01 ~]# echo $((3>2))
1
[root@node01 ~]# echo $((3>2?'a':'b'))
-bash: 3>2?'a':'b': 语法错误: 期待操作数 (错误符号是 "'a':'b'")
[root@node01 ~]# echo $((3>2?a:b))
150
[root@node01 ~]# echo $((a=3+2))
5
[root@node01 ~]# echo $((a++))
5
[root@node01 ~]#  echo $a
6
$((exp)) POSIX标准的扩展计算
这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp)),包括三目运算符
注意:这种扩展计算是整数型的计算,不支持浮点型和字符串等
若是逻辑判断,表达式exp为真则为1,假则为0
原文地址:https://www.cnblogs.com/liujunjun/p/12266675.html