bash:如何评估双括号内命令的结果

发布于 2025-01-31 12:24:15 字数 951 浏览 3 评论 0原文

被视为字符串而不是命令:

myfalse () {
    return 0
}

mytrue () {
    return 1
}

test-conditional ( ) {
    SHOW="dont-show"
    [[ ${SHOW} == "show" || mytrue ]] && echo "ok" || echo "wrong"
    [[ ${SHOW} == "show" && mytrue ]] && echo "err" || echo "ok"
    [[ ${SHOW} == "show" || myfalse ]] && echo "err" || echo "ok"
    [[ ${SHOW} == "show" && myfalse ]] && echo "err" || echo "ok"
    SHOW="show"
    [[ ${SHOW} == "show" || mytrue ]] && echo "ok" || echo "err"
    [[ ${SHOW} == "show" && mytrue ]] && echo "ok" || echo "err"
    [[ ${SHOW} == "show" || myfalse ]] && echo "ok" || echo "err"
    [[ ${SHOW} == "show" && mytrue ]] && echo "err" || echo "ok"

}

test-conditional

这显示了错误的输出:

ok
ok
err
ok
ok
ok
ok
err

我猜myTruemyfalse

因此, 双括号内的命令?

I guess mytrue and myfalse are considered strings instead of commands:

myfalse () {
    return 0
}

mytrue () {
    return 1
}

test-conditional ( ) {
    SHOW="dont-show"
    [[ ${SHOW} == "show" || mytrue ]] && echo "ok" || echo "wrong"
    [[ ${SHOW} == "show" && mytrue ]] && echo "err" || echo "ok"
    [[ ${SHOW} == "show" || myfalse ]] && echo "err" || echo "ok"
    [[ ${SHOW} == "show" && myfalse ]] && echo "err" || echo "ok"
    SHOW="show"
    [[ ${SHOW} == "show" || mytrue ]] && echo "ok" || echo "err"
    [[ ${SHOW} == "show" && mytrue ]] && echo "ok" || echo "err"
    [[ ${SHOW} == "show" || myfalse ]] && echo "ok" || echo "err"
    [[ ${SHOW} == "show" && mytrue ]] && echo "err" || echo "ok"

}

test-conditional

So this is showing wrong output:

ok
ok
err
ok
ok
ok
ok
err

(It should be ok everywhere)

How can evaluate commands inside double brackets?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

荒芜了季节 2025-02-07 12:24:15

您有truefalse返回返回代码的功能,您的最后一个条件需要校正。

您可以使用:

myfalse () {
   return 1
}

mytrue () {
   return 0
}

test-conditional ( ) {
    SHOW="dont-show"
    [[ ${SHOW} == "show" ]] || mytrue && echo "ok" || echo "wrong"
    [[ ${SHOW} == "show" ]] && mytrue && echo "err" || echo "ok"
    [[ ${SHOW} == "show" ]] || myfalse && echo "err" || echo "ok"
    [[ ${SHOW} == "show" ]] && myfalse && echo "err" || echo "ok"
    SHOW="show"
    [[ ${SHOW} == "show" ]] || mytrue && echo "ok" || echo "err"
    [[ ${SHOW} == "show" ]] && mytrue && echo "ok" || echo "err"
    [[ ${SHOW} == "show" ]] || myfalse && echo "ok" || echo "err"
    [[ ${SHOW} == "show" ]] && myfalse && echo "err" || echo "ok"
}

test-conditional

还请注意如何将函数调用放置在[[...]]否则不会调用函数的情况下。

在评估这些表达式时适用以下规则:

  1. &&之后的条件如果第一次条件失败,则不会评估。
  2. ||之后,如果第一个条件成功,则无法评估。

You have true and false functions returning opposite return codes and your last condition needs a correction.

You can use:

myfalse () {
   return 1
}

mytrue () {
   return 0
}

test-conditional ( ) {
    SHOW="dont-show"
    [[ ${SHOW} == "show" ]] || mytrue && echo "ok" || echo "wrong"
    [[ ${SHOW} == "show" ]] && mytrue && echo "err" || echo "ok"
    [[ ${SHOW} == "show" ]] || myfalse && echo "err" || echo "ok"
    [[ ${SHOW} == "show" ]] && myfalse && echo "err" || echo "ok"
    SHOW="show"
    [[ ${SHOW} == "show" ]] || mytrue && echo "ok" || echo "err"
    [[ ${SHOW} == "show" ]] && mytrue && echo "ok" || echo "err"
    [[ ${SHOW} == "show" ]] || myfalse && echo "ok" || echo "err"
    [[ ${SHOW} == "show" ]] && myfalse && echo "err" || echo "ok"
}

test-conditional

Also note how function call is placed outside [[ ... ]] otherwise it won't invoke function.

Following rules apply while evaluating these expressions:

  1. Condition after && isn't evaluated if first condition fails.
  2. Condition after || isn't evaluated if first condition succeeds.
囚你心 2025-02-07 12:24:15

在bash [[…]](以及大多数壳中的旧[…])内部,重要的是,如果测试的值是否具有某些字符:

$ [[ somevalue ]] && echo "yes" || echo "no"

如果值测试如果空,测试失败:

$ [[ "" ]] && echo "yes" || echo "no"
no

对于变量也是如此:

$ somevalue="a false string"
$ [[ $somevalue ]] && echo "yes" || echo "no"
yes

$ somevalue=""
$ [[ $somevalue ]] && echo "yes" || echo "no"
no

so,[[…]]仅限于测试字符串而不是“退出代码”。
您的功能定义“退出代码”而不是字符串。
您可以

  1. 定义myTruemyfalse的值,为表示这些值的变量:

      myTrue = a_true_value
    myfalse =“”
     

    并使用它们:

      $ show =“ dont-show”
    $ [[$ {show} ==“ show” || $ myTrue]]]&&回声“确定” ||回声“错误”
    好的
    
    $ [[$ {show} ==“ show” || $ myfalse]]]&&回声“确定” ||回声“错误”
    错误的
     
  2. 或,实际测试出口码外部[[…]]成语:

      $ myTrue(){返回0; }
    $如果mytrue;然后回声“确定”;否则回声“错误”; fi
    好的
    
    $ myTrue& amp;回声“确定” ||回声“错误”
    好的
     
  3. 一个(更复杂的)替代方案是使函数发出值并调用从[[…]] didiom中执行函数中的代码:

      $ myTrue(){echo“ a_true_value”; }
    $ myfalse(){echo“”; }
    $ show =“ dont-show”
    $ [[$ {show} ==“ show” || $(myTrue)]]]&&回声“确定” ||回声“错误”
    好的
     

一个(更复杂的)替代方案是使函数发出值,并从[[…]] idiom: ask kiss

中 (可能)最简单的解决方案是最好的解决方案:

myfalse=""
mytrue="true"

test-conditional () {
    show="dont-show"
    [[ ${show} == "show" || $mytrue  ]] && echo "ok"  || echo "wrong"
    [[ ${show} == "show" && $mytrue  ]] && echo "err" || echo "ok"
    [[ ${show} == "show" || $myfalse ]] && echo "err" || echo "ok"
    [[ ${show} == "show" && $myfalse ]] && echo "err" || echo "ok"
    show="show"
    [[ ${show} == "show" || $mytrue  ]] && echo "ok"  || echo "err"
    [[ ${show} == "show" && $mytrue  ]] && echo "ok"  || echo "err"
    [[ ${show} == "show" || $myfalse ]] && echo "ok"  || echo "err"
    [[ ${show} == "show" && $myfalse ]] && echo "err" || echo "ok"
}

test-conditional

Inside a bash [[…]] (and inside the older […] in most shells) what matters is if the value tested has some characters or not:

$ [[ somevalue ]] && echo "yes" || echo "no"

If the value tested if empty, the test fails:

$ [[ "" ]] && echo "yes" || echo "no"
no

That is also true for variables:

$ somevalue="a false string"
$ [[ $somevalue ]] && echo "yes" || echo "no"
yes

$ somevalue=""
$ [[ $somevalue ]] && echo "yes" || echo "no"
no

So, [[…]] is limited to testing strings not "exit codes".
Your functions define "exit codes" not strings.
You may

  1. define the values of mytrue and myfalse to be variables that represent those values:

    mytrue=A_True_Value
    myfalse=""
    

    And use them:

    $ show="dont-show"
    $ [[ ${SHOW} == "show" || $mytrue ]] && echo "ok" || echo "wrong"
    ok
    
    $ [[ ${SHOW} == "show" || $myfalse ]] && echo "ok" || echo "wrong"
    wrong
    
  2. Or, actually test exit codes outside a [[…]] idiom:

    $ mytrue(){ return 0; }
    $ if mytrue; then echo "ok"; else echo "wrong"; fi
    ok
    
    $ mytrue && echo "ok" || echo "wrong"
    ok
    
  3. One (more complex) alternative is to make the functions emit a value and call the execution of the code in the functions from the [[…]] idiom:

    $ mytrue(){ echo "A_True_Value"; }
    $ myfalse(){ echo ""; }
    $ show="dont-show"
    $ [[ ${SHOW} == "show" || $(mytrue) ]] && echo "ok" || echo "wrong"
    ok
    

KISS

But (probably) the simplest of solutions is the best solution:

myfalse=""
mytrue="true"

test-conditional () {
    show="dont-show"
    [[ ${show} == "show" || $mytrue  ]] && echo "ok"  || echo "wrong"
    [[ ${show} == "show" && $mytrue  ]] && echo "err" || echo "ok"
    [[ ${show} == "show" || $myfalse ]] && echo "err" || echo "ok"
    [[ ${show} == "show" && $myfalse ]] && echo "err" || echo "ok"
    show="show"
    [[ ${show} == "show" || $mytrue  ]] && echo "ok"  || echo "err"
    [[ ${show} == "show" && $mytrue  ]] && echo "ok"  || echo "err"
    [[ ${show} == "show" || $myfalse ]] && echo "ok"  || echo "err"
    [[ ${show} == "show" && $myfalse ]] && echo "err" || echo "ok"
}

test-conditional
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文