\( 在 bash 脚本中意味着什么

rha*_*lka 5 bash escaping parentheses

我正在编辑别人的.sh,我遇到了这一行

if [ "$ACTION" = "install" -o \( "$ACTION" = "start" -a -z "$APPS" \) ]
Run Code Online (Sandbox Code Playgroud)

我的理解是:

  • "$ACTION" = "install"正在检查脚本的操作是否是安装
  • -o是 OR 运算符
  • "$ACTION" = "start"正在检查脚本是否正在启动另一个程序
  • -a是 AND 运算符
  • -z "$APPS"正在检查 $APPS 是否为空字符串

我不知道什么\( "$ACTION" = "start" -a -z "$APPS" \)意思。反斜杠括号 ( \( <action> \)) 是开始/结束注释吗?我查看了这里,这不是我所期望的正常条件分组。

编辑:为了帮助代表我认为正在发生的事情,这在大多数其他编程语言中是等效的。因为我对 bash 相当陌生,所以开放式结局||对我来说并不奇怪。

if [ "$ACTION" = "install" -o \( "$ACTION" = "start" -a -z "$APPS" \) ]
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 6

\(转义字符(,因此 shell 不会将其视为语法,而是作为参数传递给test(aka [)。您也可以使用'('或达到相同的效果。"("

请注意,使用括号进行分组(以及每次调用执行多个测试操作的所有其他情况test- 含义-a和)在的 POSIX 标准-o中被标记为过时,并且不应在新代码中使用(请参阅标记标准文件中)。testOB

更好的写法是:

if [ "$ACTION" = "install" ] || { [ "$ACTION" = "start" ] && [ -z "$APPS" ]; }; then
Run Code Online (Sandbox Code Playgroud)

...或者,使用[[(提供解析器支持的 ksh 和 bash 扩展,在大多数位置不需要引号,并允许()作为测试操作的一部分进行解析,而无需转义):

if [[ $ACTION = install || ( $ACTION = start && -z $APPS ) ]]; then
Run Code Online (Sandbox Code Playgroud)