Linux脚本编程Shell中关于 () 和 {}的区别

Posted 白-胖-子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux脚本编程Shell中关于 () 和 {}的区别相关的知识,希望对你有一定的参考价值。

小括号和花括号的作用

  • 在bash中,小括号(CMD1;CMD2;…)和 花括号{ CMD1;CMD2;…; } 都可以将多个命令组合在一起,批量执行
(list) list is executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below).  
       Variable assignments and builtin commands that affect the shell's environment do not remain in effect after the command completes.  
       The return status is the exit status of list.

{ list; } list  is simply executed in the current shell environment.  list must be terminated with a newline or semicolon.  
          This is known as a group command.  The return status is the exit status of list.  
          Note that unlike the metacharacters ( and ), { and } are reserved words and must occur where a reserved  word is permitted to be recognized.  
          Since they do not cause a word break, they must be separated from list by whitespace or another shell metacharacter.
  • 这里要特别注意,花括号是有格式要求的
    { list; }
  • 花括号的前后都需要有空格,并且每一项内容必须使用分号;结束,否则报错`

小括号和花括号的区别

( list ) 小括号

  • 会开启子shell进程,并且list中变量赋值及内部命令执行后,将不再影响后续的环境
  • 帮助参看:man bash 搜索(list)

{ list; } 花括号

  • 不会新开启子shell进程, 在当前shell中运行,会影响当前shell环境
  • 帮助参看:man bash 搜索{ list; }

示例

  1. 将变量Name的值设为Linux
  2. 括号中的命令同时执行
    2.1 显示变量Name的值
    2.2 重新赋值Name为CentOS
    2.3 再次显示变量Name的值
  3. 显示变量Name的值

使用小括号赋值变量并显示

#Name=Linux;(echo $Name;Name=CentOS;echo $Name);echo $Name
Linux
CentOS
Linux
  • 因为小括号中的变量赋值只在新开启的子shell中生效
  • 所以最后一次echo的值仍然显示当前shell变量值

使用花括号赋值并显示

#Name=Linux;{ echo $Name;Name=CentOS;echo $Name; } ;echo $Name
Linux
CentOS
CentOS
  • 因为花括号不会开启新的子shell进程
  • 所以花括号中的变量赋值会影响当前shell变量值

以上是关于Linux脚本编程Shell中关于 () 和 {}的区别的主要内容,如果未能解决你的问题,请参考以下文章

Linux Bash Shell 中变量的 5 个易错点

编程中关于for的循环不能用,只能输出第一个值

Linux-shell-算术运算{exprbcdc(( ))和[ ]}

Shell中关于递归变量的问题

sh shell函数用于在shell脚本中进行波浪扩展。适用于Linux和OS X.

shell脚本中那些关于时间的处理方案,你都掌握了吗?