2017-04-25 65 views
0

我有一个由 Python脚本生成的bash命令:Bash脚本有意外的标记`;;'

platform=$(case $(uname) in 
    "Linux") echo "linux-x86_64" ;; 
    "Darwin") echo "darwin64-x86_64-cc" ;; 
    *) echo "Unknown" esac); 
cp -r $SRCDIR $OUT && cd $OUT && ./Configure shared $platform --prefix=$OUT/build --openssldir=$OUT/build/openssl && make && make install 

当我尝试执行它,我收到以下错误:

unexpected token `;;'

我做了什么错在这里?

我是最新的macOS。

+0

http://stackoverflow.com/questions/34502492/how-to-use-case-esac-in-process-substitution –

回答

3

关于“Linux”情况下的关闭)正在终止进程替换。由于它是bash中,只要使用的情况下匹配的括号:

platform=$(case $(uname) in 
    ("Linux") echo "linux-x86_64" ;; 
    ("Darwin") echo "darwin64-x86_64-cc" ;; 
    (*) echo "Unknown";; 
    esac 
) 

(另请注意,我不得不默认情况后添加;;。)

4

一个更清晰,更有效的方式来编写代码将是:

case $(uname) in 
    "Linux") platform="linux-x86_64" ;; 
    "Darwin") platform="darwin64-x86_64-cc" ;; 
    *) platform="Unknown" ;; 
esac 

具有echo$()捕捉到的结果是一个shell反模式的东西。为什么要直接使用文本时写入标准输出和从标准输入读取?

+2

我正在辩论投票或删除我自己的答案!不确定删除是否正确,因为不匹配的关闭paren可能是一个常见的错误来源,但这种解决方案更适合这种情况。 –

0

我会使用类似:

get_platform() { 
     case "${1,,}" in 
       darwin*) echo darwin64... ;; 
       freebsd*) echo freebsd... ;; 
       linux*) echo linux-x86_64.. ;; 
       cygwin*) echo cyg... ;; 
       *) return 1;; 
     esac 
     return 0 
} 

platform=$(get_platform "$OSTYPE" || get_platform $(uname)) 
echo "${platform:-Unknown}" 

仔细检查 - 操作系统bash存储在$OSTYPE变量。如果失败(其他shell),它仍然尝试使用uname

如果未检测到操作系统,最终决定将填充到主脚本(return 1),以便您可以根据需要检查和调整它,如echo "${platform:-Unknown}"