此脚本演示了如何使用括号定义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
答案 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环境"。