通常,使用花括号来定义bash函数来包围正文:
foo()
{
...
}
Run Code Online (Sandbox Code Playgroud)
今天在处理shell脚本时大量使用函数时,我遇到的问题是调用函数中调用的名称相同的变量,即那些变量是相同的.然后我发现可以通过将函数内部的局部变量定义为local来防止这种情况:local var=xyz
.
然后,在某些时候,我发现了一个线程(使用括号而不是大括号定义bash函数体),其中解释了使用括号来定义函数同样有效:
foo()
(
...
)
Run Code Online (Sandbox Code Playgroud)
这样做的结果是函数体在子shell中执行,这有利于函数具有自己的变量范围,这允许我在没有本地的情况下定义它们.由于具有函数局部范围似乎更有意义,并且比所有变量全局更安全,我立即问自己:
但是,我很快发现了在子shell中执行该函数的一个主要缺点,特别是从函数内部退出脚本不再起作用,而是迫使我在整个调用树中使用返回状态(如果是嵌套函数).这引出了我的后续问题:
(*)我知道(从异常相关的讨论中我偶然发现),有些人认为明确使用错误状态比从任何地方退出要好得多,但我更喜欢后者.
显然这两种风格都有其优点和缺点.所以我希望你们中有些经验丰富的bash用户可以给我一些一般指导:
编辑:从答案的转移
谢谢你的回答,我的脑袋现在对此更加清晰.所以我从答案中得到的是:
坚持传统的花括号,如果只是为了不混淆脚本的其他潜在用户/开发者(如果整个身体被括在括号中,甚至使用括号).
花括号的唯一真正缺点是可以更改父作用域中的任何变量,尽管在某些情况下这可能是一个优点.通过将变量声明为可以很容易地避免这种情况local
.
另一方面,使用括号可能会产生一些严重的不良影响,例如搞乱退出,导致杀死脚本的问题以及隔离变量范围.
我刚刚从php.net下载了完整的PHP源代码(PHP 5.4.0 [tar.bz2]).它们通常使用三个大括号,如下所示(以下代码片段从ext/ctype/ctype.c中提取.)
/* {{{ proto bool ctype_digit(mixed c)
Checks for numeric character(s) */
static PHP_FUNCTION(ctype_digit)
{
CTYPE(isdigit);
}
/* }}} */
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么他们一起使用这三个大括号?
类内初始值设定项(C++ 11特性)必须用花括号括起来或跟在=符号后面.它们可能未在括号内指定.
这是什么原因?
可能重复:
在String.Format中转义大括号'{'
c#有一个String.Format方法,允许您格式化字符串,但是使用标记插入params {0}
{1}
我试图创建一个简单的json字符串,需要大括号在字符串中,因此它打破了格式化程序
String.Format("{ foo:'{0}', bar:'{1}' }", foo, bar);
Run Code Online (Sandbox Code Playgroud)
在括号之前添加一个逃脱没有帮助
抛出一个异常,说我的字符串格式不正确,有人知道怎么解决这个问题吗?
此字符串是JSON对象/文件的一部分:
"Mask" : "{0}(CASE WHEN {1} = {2} THEN {3} ELSE 0 END) {4}"
Run Code Online (Sandbox Code Playgroud)
JSON会认识到这是标准JSON表示法的一部分还是我需要以某种方式逃避那些花括号?
如果是这样,如何在JSON中逃避花括号?
我发现了这个问题的其他重复,但它们已经很老了,解决方案不适用于R#8,因为设置已经改变.
当我做匿名类型或对象初始化(任何类型的花括号缩进与内容),我希望它是BSD风格:
var test = new CustomType
{
Prop1 = value1,
Prop2 = value2,
};
Run Code Online (Sandbox Code Playgroud)
...并将R#选项/代码编辑/ C#/格式化样式/大括号布局/数组和对象初始值设置为"下一行(BSD样式)".但是,当我在添加一个新的大括号后按Enter键时,我仍然最终得到这个:
var test = new CustomType
{
Prop1 = value1,
Prop2 = value2,
};
Run Code Online (Sandbox Code Playgroud)
......我相信是白人的风格.
我需要做些什么才能让R#8不缩进初始化器的大括号?
Visual Studio 2010中是否有键盘快捷键(我也使用ReSharper 6.1),这将允许我用大括号包围选定的文本块?我尝试了"Surround With ..." (Ctrl + K,Ctrl + S),但我没有看到列表中的选项来选择花括号作为周围元素.这个的常见用例是我将有一个if语句,如下所示:
if (conditional)
statement1;
// the rest of the program
Run Code Online (Sandbox Code Playgroud)
我会发现在if语句中需要执行一些额外的任务并添加它们:
if (conditional)
statement1;
statement2;
statement3;
// the rest of the program
Run Code Online (Sandbox Code Playgroud)
然后,我记得我需要用花括号包装所有语句,代码应该看起来像这样:
if (conditional)
{
statement1;
statement2;
statement3;
}
// the rest of the program
Run Code Online (Sandbox Code Playgroud)
我想要做的只是选择三个语句,然后点击快捷键将它们包装在花括号中.我实际上最终做的是将光标移动到条件之后的行的开头,然后键入{字符,然后删除}字符,ReSharper(无用)在{之后立即自动插入,然后将光标向下移动到结尾块的最后一个语句和输入}来完成块.
关注以下代码:
int[] to = new int[] { text };
Run Code Online (Sandbox Code Playgroud)
我理解它试图定义一个整数数组,但花括号在数组定义中做了什么?
我正在阅读OpenCart的源代码,我在下面遇到了这样的表达.有人可以向我解释一下:
$quote = $this->{'model_shipping_' . $result['code']}->getQuote($shipping_address);
Run Code Online (Sandbox Code Playgroud)
在声明中,有一个奇怪的代码部分,
$this->{'model_shipping_' . $result['code']}
它有{}
,我不知道那是什么?它看起来像我的对象,但我不是很确定.
有人请解释以下内容:
我跟随丹阿布拉莫夫的讲座和做练习.
代码工作正常,但是当使用大括号编写以下特定函数时,测试失败**{ }**
.
case 'toggleTodo' :
return (
state.map( (one) => {
oneTodo( one, action )
})
);
Run Code Online (Sandbox Code Playgroud)
相同的代码工作正常,没有花括号.
case 'toggleTodo' :
return (
state.map( (one) =>
oneTodo( one, action )
)
);
Run Code Online (Sandbox Code Playgroud)
这是JsBin.请参阅第31行.
javascript brackets curly-braces ecmascript-6 arrow-functions
curly-braces ×10
c# ×2
php ×2
resharper ×2
arrays ×1
bash ×1
brackets ×1
c++ ×1
c++11 ×1
ecmascript-6 ×1
escaping ×1
folding ×1
function ×1
initializer ×1
java ×1
javascript ×1
json ×1
parentheses ×1
vim ×1