条件评估为" TRUE"

时间:2017-07-13 16:25:25

标签: shell unix if-statement scripting

我正在尝试使用shell脚本检查数据库中的重复记录。 为此,我创建了一个名为" check()"的函数。回声的真或假,存储在变量"结果"中。但是在使用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
}

1 个答案:

答案 0 :(得分: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
}