bash 括号(小括号,双小括号,中括号,双中括号,大括号)


小括号()和大括号{}

主要包括一下几种

  • ${var} 
  • $(cmd) 
  • ()和{} 
  • $((exp)) 
  • ${var:-string},${var:+string},${var:=string},${var:?string} 
  • $(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)

1.shell变量应用原型 ${var}

2.变量替换 ${cmd}与`cmd`类似

注意:$(cmd)只输出标准输入,如果命令执行错误,则无输出

3. 一串命令执行 ()和{},

    二者都用于执行一串命令,指令之间用;分开,注意:括号内的数据重导向只影响括号内部的指令输入输出,不影响括号外部的指令

    不同之处如下:

    运行方式:

1)()重新开启一个shell运行命令,{}在当前shell运行

2)()最后一条指令不需要; , {}最后一条指令需要;

3)  {}第一个指令和左括号需要有空格,()不需要

下面是一个简单的例子  

 1 $ var=test 
 2 $ (var=notest; echo $var) ###变量var值为notest,此是在子shell中有效 
 3 notest 
 4 $ echo $var ###父shell中值仍为test 
 5 test 
 6 $ { var=notest; echo $var;} ###注意左括号和var之间要有一个空格 
 7 notest 
 8 $ echo $var ###父shell中的var变量的值变为了notest 
 9 notest 
10 $ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###输出test1被重定向到文件a中, 
11 test2 ###而test2输出则仍输出到标准输出中。 
12 $ cat a 
13 test1 
14 $ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括号内命令的标准输出全部被重定向到文件a中 
15 $ cat a 
16 test1 
17 test2

4.$((expr))用于执行数学运算,语法类似c语言

   例子如下

 1 $ echo $((3+2)) 
 2 5 
 3 $ echo $((3>2)) 
 4 1 
 5 $ echo $((25<3 ? 2:3)) 
 6 3 
 7 $ echo $var
 8  
 9 $ echo $((var=2+3)) 
10 5 
11 $ echo $var 
12 5 
13 $ echo $((var++)) 
14 5 
15 $ echo $var 
16 6 
17 $

在刚开始学习inux shell脚本编程时候,对于它的 四则运算以及逻辑运算。估计很多朋友都感觉比较难以接受。特变逻辑运算符”[]”使用时候,必须保证运算符与算数 之间有空格。 四则运算也只能借助:let,expr等命令完成。 今天讲的双括号”(())”结构语句,就是对shell中算数及赋值运算的扩展。

使用方法:

语法:

((表达式1,表达式2…))

特点:

1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。

2、在双括号结构中,所有变量可以不加入:“$”符号前缀。

3、双括号可以进行逻辑运算,四则运算

4、双括号结构 扩展了for,while,if条件测试运算

5、支持多个表达式运算,各个表达式之间用“,”分开

使用实例:

  • 扩展四则运算
1 2 3 4 5 6 7 8 9 10 11 #!/bin/sh   a=1; b=2; c=3;   ((a=a+1)); echo $a;   a=$((a+1,b++,c++)); echo $a,$b,$c

运行结果:

sh testsh.sh
2
3,3,4

双括号结构之间支持多个表达式,然后加减乘除等c语言常用运算符都支持。如果双括号带:$,将获得表达式值,赋值给左边变量。

  • 扩展逻辑运算
  #!/bin/sh a=1; b="ab"; echo $((a>1?8:9)); ((b!="a"))&& echo "err2"; ((a<2))&& echo "ok";

运行结果:

sh testsh.sh
9
err2
ok

  • 扩展流程控制语句(逻辑关系式)
  #!/bin/sh num=100; total=0; for((i=0;i<=num;i++)); do     ((total+=i)); done echo $total;   total=0; i=0; while((i<=num)); do     ((total+=i,i++)); done echo $total;   if((total>=5050));then     echo "ok"; fi

运算结果:

sh testsh.sh
5050
5050
ok

有了双括号运算符:[[]],[],test 逻辑运算,已经let,expr 都可以抛到一边了。

https://blog.csdn.net/claytonzeng/article/details/10267225

参考:https://blog.csdn.net/DLUTBruceZhang/article/details/9230757