使用括号而不是大括号定义bash函数体

时间:2013-02-01 17:41:02

标签: bash bash-function

此脚本演示了如何使用括号定义bash函数 带括号的经文。括号具有良好的制作效果 我想,在函数“local”中创建的环境变量 因为函数体是作为子shell执行的。输出是:

A=something
A=
B=something
B=something

问题是这是否是允许定义函数的语法。

#!/bin/bash

foo() (
    export A=something
    echo A=$A
)

bar() {
    export B=something
    echo B=$B
}

foo
echo A=$A
bar
echo B=$B

2 个答案:

答案 0 :(得分:9)

是的,允许使用该语法。如bash man page中所述,bash函数的定义是:

[ function ] name () compound-command [redirection]

更多描述(也来自手册页):

  

该函数的主体是复合命令compound-command。该命令通常是{}之间的命令列表,但可以是上面复合命令下列出的任何命令。

(){}附带的列表是复合命令。完整列表(再次从手册页,只是编辑到一个简单的列表):

  

复合命令是以下之一:

(list)
{ list; }
((expression))
[[expression]]
for name [ in word ] ; do list ; done
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
select name [ in word ] ; do list ; done
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
while list; do list; done
until list; do list; done

答案 1 :(得分:3)

两者都有效,并且正如Carl所提到的,也可以使用任何复合命令,例如:

$ f() if [ "$1" = 'a' ]; then echo 'equals a'; fi
$ f a
equals a
$ f b
$

POSIX 7 2.9.5功能定义命令 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05

  

函数定义命令的格式如下:

     

fname()compound-command [io-redirect ...]

     

[...]参数compound-command表示复合命令,如复合命令中所述。

然后 2.9.4复合命令 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04

  

(复合列表)[...]在列表完成后,影响环境的变量赋值和内置命令不会保持有效。

     

{compound-list;}在当前流程环境中执行复合列表。

语义与没有函数定义时使用()的语义相同:它不会创建新进程,而是在POSIX和Bash调用"子shell环境"。