简单条件在bash中得到错误的评估结果[重复]

Posted

技术标签:

【中文标题】简单条件在bash中得到错误的评估结果[重复]【英文标题】:Simple condition getting wrong evaluation result in bash [duplicate] 【发布时间】:2021-08-13 03:00:56 【问题描述】:

我有这个 bash 脚本获取布尔参数,基于 answer here 我创建了这个简单的条件,由于某种原因,我得到了错误的结果

#!/bin/bash

copyFile() 
    echo "copyFile #Parameter:$1"

    if [ "$1" ]; then
             echo "Parameter is true"
        else
             echo "Parameter is false"
        fi




copyFile true
copyFile false

执行结果:

[admin@local_ip_tmp]$ ./test.sh
copyFile #Parameter:true
Parameter is true
copyFile #Parameter:false
Parameter is true

最后的结果应该是“参数为假”我不知道发生了什么。 做错了什么?

【问题讨论】:

提示:false 只是一个字符串,它不是空的 准确测试您想要测试的内容。您当前的测试等效于if [ -n "$1" ](如果$1 不为空)。你追求什么? if [ "$1" = "true" ]if [ "$1" != "true" ]if [ "$1" = "false" ] 或 ... 删除[] @JavaSheriff,我个人建议使用带有整数常量的算术测试上下文。 if (( $1 )); then ...0 视为 false,所有正整数都视为 true。 @JavaSheriff,你是什么意思?在我之前的评论中,那 一个例子。除了用then 块的实际内容替换... 之外,它不需要更改,只要您的$10 为false 和1 为true。 【参考方案1】:

linked post 上的accepted answer 以:

bash 不知道布尔变量,也不知道测试

因此,如 cmets 中所述[1][2]if [ "$1" ]; 被评估为 if [ -n "$1" ],并且由于 $1 不为空,"Parameter is true" 将被打印。


要测试是否给出了字符串"true",可以使用以下代码

#!/bin/bash

copyFile() 
    echo "copyFile #Parameter:$1"

    if [ "$1" = "true" ]; then
    echo "Parameter is true"
    else
        echo "Parameter is false"
    fi


copyFile "true"
copyFile "false"

这将产生:

copyFile #Parameter:true
Parameter is true
copyFile #Parameter:false
Parameter is false

你可以测试on this online demo。

【讨论】:

== 应该是 =。因为它适用于 bash 本身,但不适用于基线 POSIX shell。请参阅the POSIX standard for test,它根本没有指定==

以上是关于简单条件在bash中得到错误的评估结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中同时捕获标准输出和标准错误 [重复]

bash中的条件[重复]

分类模型评估指标汇总

if 条件中的语法错误。不等号突出显示[重复]

如何有条件地评估 bash 脚本

带有浮点数的 Mod 给出错误的结果 [重复]