()和{}都是对一串的命令进行执行,但有所区别
相同点
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
不同点
()只是对一串命令重新开一个子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