如果bash中的statment包含多个组?

如果bash中的statment包含多个组?,bash,travis-ci,Bash,Travis Ci,我想要的是 if((TRAVIS_BRANCH != "master") || (TRAVIS_BRANCH == "master" && TRAVIS_PULL_REQUEST == true) 在bash中如何执行此操作?我认为这是最接近的,但它仍然不起作用 if [ "$TRAVIS_BRANCH" != "master" ] || ["$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "t

我想要的是

if((TRAVIS_BRANCH != "master") || (TRAVIS_BRANCH == "master" && TRAVIS_PULL_REQUEST == true)
在bash中如何执行此操作?我认为这是最接近的,但它仍然不起作用

if [ "$TRAVIS_BRANCH" != "master" ] || ["$TRAVIS_BRANCH" == "master" &&  "$TRAVIS_PULL_REQUEST" == "true"]

在命令名周围加空格(
[
是命令名),不要试图在单个
[
命令中使用
&&
|

if [ "$TRAVIS_BRANCH" != "master" ] || { [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "true"]; }
但是,您可以在
[[]]
的内部使用
&&
|
,也不需要在此处引用:

if [[ $TRAVIS_BRANCH != master ]] || [[ $TRAVIS_BRANCH = master && $TRAVIS_PULL_REQUEST = true ]]
尝试:

  • 确保
    [
    ]
    字符周围有空格
  • Double equals在Bash中工作,但与POSIX不兼容
  • 您必须在
    [
  • 由于是外壳代码,建议不要在每行代码中使用多个布尔运算符
  • 建议在Bash中使用
    [[
    而不是
    [
结果:

is_master_pull_request() {
    [[ "$TRAVIS_BRANCH" = "master" ]] && [[ "$TRAVIS_PULL_REQUEST" = "true" ]]
}
if [[ "$TRAVIS_BRANCH" != "master" ]] || is_master_pull_request

无法正常工作?看起来您至少有一个语法错误。当第一次检查
[“$TRAVIS_BRANCH”!=“master”]
失败时,猜猜看
“$TRAVIS_BRANCH”会发生什么
将是:您不需要在第二次检查中检查它。是的,这将起作用。出于
[[]]
内部的风格原因,我更喜欢
=
(因为它是兼容POSIX的运营商),但
==
是完全允许的。POSIX出于正当理由不推荐使用
-a
语法。请参阅--您会注意到,所有带有4个或更多参数的
test
(您的参数有7个)的使用都会产生标准未指定的结果。(参数如
在此上下文中可能被解析为分组运算符而不是数据,从而导致不明确的情况)。
is_master_pull_request() {
    [[ "$TRAVIS_BRANCH" = "master" ]] && [[ "$TRAVIS_PULL_REQUEST" = "true" ]]
}
if [[ "$TRAVIS_BRANCH" != "master" ]] || is_master_pull_request