![Bash:类似函数的结构,不需要调用?](https://linux22.com/image/127780/Bash%EF%BC%9A%E7%B1%BB%E4%BC%BC%E5%87%BD%E6%95%B0%E7%9A%84%E7%BB%93%E6%9E%84%EF%BC%8C%E4%B8%8D%E9%9C%80%E8%A6%81%E8%B0%83%E7%94%A8%EF%BC%9F%20.png)
我想要某种看起来类似于 Bash 函数但不是函数的数据结构。 A命名的按上下文组织命令的结构,还应该允许前导选项卡。
当您的文件包含 20 个 Bash 函数但不需要 20 行函数调用时,这很好。
比较:
重击函数:
x() {
echo "x"
}
x
我寻求的数据结构:
context {
echo "x"
}
我在此类数据单元中组织命令的方式与使用函数组织命令的方式类似,但没有参数括号()
且没有函数调用。
这种结构的名称是什么?你会如何做?
笔记
结构的名称应始终位于其前面,在同一行中,就像函数一样。
此处文档不是解决方案,在这种情况下,我希望通过语法实现更简单的东西。
答案1
它被称为一个复合命令语法是
{ compound-list; }
(这是一例子复合命令,其他诸如for
循环等也是复合命令)
例如:
{
echo 'hello'
echo 'world'
}
仅;
当最后一个之前没有换行符时才需要}
:
{ echo 'hello'; echo 'world'; }
构造中的命令{ ...; }
在当前的环境,就像函数一样。
有关此内容的更多信息,请参阅POSIX 标准对复合命令的描述。
没有理由(或可能性)命名这些部分,因为命名此类部分或多或少相当于创建 shell 函数。此外,仅当稍后引用复合命令时才需要命名复合命令,这就是函数的用途。
显然可以使用注释:
# my hello world thing
{
echo 'hello'; echo 'world'
}
以类似的方式,子外壳可以具有
(
echo 'hello'
echo 'world'
)
这在当前 shell 的子环境中执行,并且对变量等的更改将不是反映在当前 shell 中。
一般语法是
( compound-list )
;
在这里,之前就不需要决赛了)
。
奇怪的是,shell 函数可以使用(...)
代替{...;}
在本地环境中执行代码:
helloworld () (
echo 'hello'
echo 'world'
)
sh
这对于了解是否正在使用不支持局部变量(local
或typeset
in )的语言编写函数bash
并且不需要修改脚本环境可能很有用。
答案2
评论够了吗?
您可以按如下方式使用它们来重新组合命令并为这些组提供名称,并且没有任何内容禁止您使用缩进:
#context1
echo "I'm in context1"
#end of context1
#context2
echo "I'm in context2"
#end of context2
您还可以使用 重新组合命令{...}
,据我所知,这在这种情况下不会产生任何其他影响:
#context1
{
echo "I'm in context1"
}
#end of context1
{ #context2
echo "I'm in context2"
} #end of context2
如果您还想将这些上下文与本地范围相关联,您可以使用 subshells :
#context1
(
context="context1"
echo "I'm in $context"
)
#end of context1
( #context2
echo "I'm in $context" #context is undefined there
context=context2
echo "I'm in $context"
) #end of context2