【问题标题】:What does \( mean in a bash script\( 在 bash 脚本中是什么意思
【发布时间】:2021-11-25 21:50:39
【问题描述】:

我正在编辑别人的.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 == '' */)

【问题讨论】:

  • 对表达式进行分组,就像用其他编程语言编写数学表达式一样。
  • 在这种情况下,它是通过转义 () 字符来对内部表达式进行分组,这可能意味着没有转义序列的其他内容。
  • @Barmar 但是这如何解释反斜杠?
  • 反斜杠是转义字符,以防止它被视为启动子shell。你也可以写'('
  • [ 使用( 进行分组。 shell 使用( 来启动一个子shell。 \(( 从 shell 中转义,以便 [ 可以看到它,因此 shell 不会抛出错误:[ \( x \) ] && echo ok; [ ( x ) ] && echo oops

标签: bash escaping parentheses


【解决方案1】:

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

请注意,在the POSIX standard for test 中使用括号进行分组(以及在每个test 调用中执行多个测试操作的所有其他情况——也意味着-a-o)在the POSIX standard for test 中被标记为过时,并且不应在新代码中使用(请参阅标准文档中的 OB 标记)。

更好的写法是:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多