在开始 Linux 编程书。有一节是关于语句块。该部分的解释如下所示。
语句块
如果要在只允许使用一条语句的地方(例如在 AND 或 OR 列表中)使用多条语句,可以将它们括在大括号 {} 中以形成语句块。例如,请参阅以下代码:
get_confirm && {
grep −v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
请解释一下语句块中的代码是如何执行的...
答案1
其中的代码的{ ... }
执行方式与没有大括号时的执行方式完全相同,只不过现在它依赖于 的退出状态get_confirm
。
如果get_confirm
以零退出状态(“成功”)退出,则块执行,否则不执行。
这几乎相当于
if get_confirm; then
# the contents of the block goes here
fi
(我认为看起来更好)。 “几乎”是因为每个语句报告的结果状态存在差异 if get_confirm
returns错误的(短路代码将设置$?
为非零,而if
语句将同一变量设置为零),这可能很重要,具体取决于 shell 中设置的选项以及周围代码的作用。
恕我直言,这本书的示例并不是{ ... }
.一个更好的例子是
{ echo 'hello world'; date; } >file
它使用单个重定向将{ ... }
块中两个命令的标准输出重定向到同一个文件。
这类似于(并且在本例中具有相同的效果)
( echo 'hello world'; date ) >file
但其中的语句{ ... }
在与 shell 相同的环境中执行,而 in 中的语句( ... )
在子 shell(单独的环境)中执行。
你可以看到区别
{ a=42; }; echo $a
和
( a=1973 ); echo $a
第一个将输出42
,而第二个将不输出1973
(赋值发生在子 shell 中,并且不会影响外部环境)。
}
关于语法的注意事项:块的结束{ ... }
必须遵循换行符或;
。 { echo 'hello' }
无效,而{ echo 'hello'; }
和
{
echo 'hello'
}
是。