语句块Shell 脚本中的机制?

ala*_*min 9 shell bash zsh shell-script

开始 Linux 编程一书中。有一节是关于Statement Block 的。在该部分中,解释如下所示。

语句块

如果您想在只允许一个语句的地方使用多个语句,例如在 AND 或 OR 列表中,您可以通过将它们括在大括号 {} 中以形成语句块来实现。例如,请参阅以下代码:

get_confirm && {
    grep ?v "$cdcatnum" $tracks_file > $temp_file 
    cat $temp_file > $tracks_file
    echo
    add_record_tracks
}
Run Code Online (Sandbox Code Playgroud)

请解释代码在语句块中是如何执行的...

Kus*_*nda 17

中的代码{ ... }完全按照没有花括号的方式执行,除了现在它依赖于get_confirm.

如果get_confirm以零退出状态(“成功”)退出,则块执行,否则不执行。

它相当于

if get_confirm; then
    # the contents of the block goes here
fi
Run Code Online (Sandbox Code Playgroud)

(我觉得更好看)

这本书的例子恕我直言,不是一个常见用法的好例子{ ... }。一个更好的例子是

{ echo 'hello world'; date; } >file
Run Code Online (Sandbox Code Playgroud)

它使用单个重定向将{ ... }块中两个命令的标准输出重定向到同一个文件。

这类似于(并且在本例中具有相同的效果)

( echo 'hello world'; date ) >file
Run Code Online (Sandbox Code Playgroud)

但是其中的语句在{ ... }与外壳相同的环境中( ... )执行,而中的语句在子外壳(单独的环境)中执行。

你可以看到不同之处

{ a=42; }; echo $a
Run Code Online (Sandbox Code Playgroud)

( a=1973 ); echo $a
Run Code Online (Sandbox Code Playgroud)

第一个将输出,42而第二个将不输出1973(分配发生在子外壳中,它不会影响外部环境)。

关于语法注意事项:截止}一的{ ... }块必须遵循一个换行符或;{ echo 'hello' }无效,而{ echo 'hello'; }

{ 
    echo 'hello'
}
Run Code Online (Sandbox Code Playgroud)

是。