在Bash脚本中,符号\( )代表将其中的命令作为子shell来运行。

5
我正在编辑别人的.sh文件,然后遇到了这一行。
if [ "$ACTION" = "install" -o \( "$ACTION" = "start" -a -z "$APPS" \) ]

我理解的是:
  • "$ACTION" = "install" 检查脚本的操作是否为安装
  • -o 是OR运算符
  • "$ACTION" = "start" 检查脚本是否启动另一个程序
  • -a 是AND运算符
  • -z "$APPS" 检查 $APPS 是否为空字符串
我不知道 \( "$ACTION" = "start" -a -z "$APPS" \) 的意思。反斜杠括号(\( <action> \))是开始/结束注释吗?我在这里看过 here,这不是我预期的常规条件分组方式。
编辑:为了帮助表示我认为正在发生的事情,这是大多数其他编程语言中的等效方式。因为我对bash相当新,所以开放式的 || 对我来说并不奇怪。
if (ACTION == 'install' || /* ACTION == 'start' && APPS == '' */)

1
在这种情况下,需要通过转义 () 字符来分组内部表达式,否则它们可能会被解释为其他含义。 - h0r53
@Barmar 但是这怎么解释反斜杠呢? - matt
2
反斜杠是转义字符,用于防止其被视为启动子shell的符号。您也可以写成 '(' - Barmar
4
[ 使用 ( 进行分组。Shell 使用 ( 来启动子 shell。\( 用于将 ( 从 Shell 中转义,以便 [ 可以看到它,使得 Shell 不会抛出错误:[ \( x \) ] && echo ok; [ ( x ) ] && echo oops - jhnc
但是如果有人想要撰写正式答案,\( \) 的目的已经得到了回答。 - rhavelka
显示剩余3条评论
1个回答

6

\(转义字符(,以便Shell不将其作为语法处理,而是将其作为参数传递给test(也称为[)。您还可以使用'('"("来实现相同的效果。

请注意,在分组(以及每次执行多个测试操作的所有其他情况下,例如-a-o)时,使用括号已在 POSIX标准中的test中被标记为过时,并且不应在新代码中使用(请参见标准文档中的OB标记)。

更好的编写方式如下:

if [ "$ACTION" = "install" ] || { [ "$ACTION" = "start" ] && [ -z "$APPS" ]; }; then

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

if [[ $ACTION = install || ( $ACTION = start && -z $APPS ) ]]; then

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接