shell脚本中的语法错误说意外的令牌`(

时间:2014-05-25 08:30:50

标签: bash shell

我编写了以下shell脚本

while :; do
status=$($EMR_BIN/elastic-mapreduce --jobflow $JOBFLOW --list | grep "CopyLogs" | awk '{print $1}')
[[ $status == +( *RUNNING*|*PENDING*|*WAITING* ) ]] || break
sleep 60
done

它在第3行给出了一个错误syntax error in conditional expression: unexpected token(''。我尝试在我的大括号之间添加空格,但它不起作用。

任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

看起来你正在尝试使用扩展的globbing。确保在脚本的前面某处有shopt -s extglob,或者重写以使用标准的globbing。

#!/bin/sh
while :; do
    case $($EMR_BIN/elastic-mapreduce --jobflow $JOBFLOW --list | awk '/CopyLogs/{print $1}') in
        *RUNNING*|*PENDING*|*WAITING* ) sleep 60;; 
        *) break;;
    esac
done

由于没有剩余的Bashisms,此脚本现在与POSIX sh兼容。 (就个人而言,我也认为这种方式更具可读性。)

(另请注意无用的grep | awk的修复。)