语句块

语句块

开始 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_confirmreturns错误的(短路代码将设置$?为非零,而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'
}

是。

相关内容