当一个提示,我可以输入:插值规则定义一个函数
$ e() { echo $1; }
,并得到呼应其第一个参数的函数。我不明白为什么这会起作用。因为$ 1当前的环境是不确定的,似乎上面的应该是等同于:
$ e() { echo ; }
什么是相关报价/内插规则,允许这种行为?请注意,这与$1
非常特别无关:如果您使用的是$FOO
,那么函数调用时会得到一个函数,它会在函数调用时回调$FOO
的值,而不是函数定义时的值$FOO
。
当一个提示,我可以输入:插值规则定义一个函数
$ e() { echo $1; }
,并得到呼应其第一个参数的函数。我不明白为什么这会起作用。因为$ 1当前的环境是不确定的,似乎上面的应该是等同于:
$ e() { echo ; }
什么是相关报价/内插规则,允许这种行为?请注意,这与$1
非常特别无关:如果您使用的是$FOO
,那么函数调用时会得到一个函数,它会在函数调用时回调$FOO
的值,而不是函数定义时的值$FOO
。
不知道我怎么错过了这个,因为它是在第2.9.5节很清楚:
当声明函数时,应进行无在wordexp的扩张的在复合命令或io-redirect中的文本上;每次调用函数时,所有的扩展都应该照常进行。同样,可选的io-redirect重定向和复合命令中的任何变量赋值都应在函数本身执行期间执行,而不是函数定义。请参阅Shell错误的后果,了解这些操作在交互式和非交互式shell上的失败后果。
像$1
这样的变量是表示从命令行传递的参数的特殊变量。看到这里的“位置参数”部分:http://tldp.org/LDP/abs/html/internalvariables.html
与$ FOO而不是$ 1发生完全相同的行为 – 2012-02-09 16:15:02
换句话说,函数声明中的代码在运行函数时运行,而不是在创建函数时运行。 – l0b0 2012-02-09 16:33:16