【问题标题】:condition evaluating to "TRUE"条件评估为“真”
【发布时间】:2017-12-18 13:43:45
【问题描述】:

我正在尝试使用 shell 脚本检查数据库中的重复记录。 为此,我创建了一个名为“check()”的函数,它回显 True 或 False,并存储在变量“result”中。但是在使用 if 语句进行评估时,它总是返回“True”。

#redundancy check function
check() {
    temp=$(grep -w -c "$1" database.dat)
    echo $temp
    if [ "$temp" != 0 ]
        then
            echo True
        else
            echo False
    fi
}

insert() {
    option="y"
    while [ "$option" == "y" ]
    do
        echo "Rollno: \c"
        read roll
        result="$(check $roll)"
        echo $result
        if [ "$result" == "False" ]
            then        
                echo Do something
            else
                echo "ERROR: Duplicate record found...\nEXITING...\n"
                option="n"
        fi
    done
}

【问题讨论】:

  • 仅供参考,POSIX test 中指定的唯一字符串比较运算符是 =,而不是 ==;见pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
  • 另外,\n 将在传递给 echo 的字符串中执行的操作不是 POSIX 指定的(echo 的某些不兼容版本支持 -e 参数以使 echo 处理此类转义;其他人默认处理它们;其他人根本不处理)。如果您想要一致的行为,请使用 printf。
  • 另请注意,您将字符串与 int 进行比较。请改用$((temp)) -ne 0
  • 好吧——最好完全避免grep -c(或者,否则,一个没有-q 的grep 或类似GNU 的-m 1 的扩展名)。使用它会强制 grep 通读整个 database.dat 以计算所有匹配项,但 OP 只想知道匹配项的数量是否为零——这意味着如果第一行是匹配项,@ 987654339@ 可以在看到后立即退出,而无需读取文件中的任何其他内容,而 grep -c 仍然需要读取所有其他行来生成其计数。

标签: shell unix if-statement scripting


【解决方案1】:

如果您使用的 shell 不支持将 == 扩展为 test,那么您的测试将永远无条件地失败,因为语法无效。使用= 进行字符串比较,以便移植到所有符合 POSIX 的实现。

此外,存储然后比较来自grep 的输出根本没有意义:当您的唯一目标是检查匹配数是零还是大于零时,请使用grep -q 的退出状态;这允许grep 在看到匹配项时立即退出,而无需读取文件的其余部分。

# with -q, this emits no stdout, but exits w/ status 0 (matches exist) or 1 (otherwise)
check() { grep -q -w -e "$1" database.dat; }

insert() {
  option=y
  while [ "$option" = y ]; do
    printf '%b\n' "Rollno: \c"
    read -r roll
    if check "$roll"; then
      printf "ERROR: Duplicate record found...\nEXITING...\n"
      option=n
    else
      echo "Check failed; do something"
    fi
  done
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多