Shell 条件评估为;“真的”;
我正在尝试使用shell脚本检查数据库中的重复记录。 为此,我创建了一个名为“check()”的函数,它的echo值为True或False,并存储在变量“result”中。但在使用if语句求值时,它总是返回“True”Shell 条件评估为;“真的”;,shell,unix,if-statement,scripting,Shell,Unix,If Statement,Scripting,我正在尝试使用shell脚本检查数据库中的重复记录。 为此,我创建了一个名为“check()”的函数,它的echo值为True或False,并存储在变量“result”中。但在使用if语句求值时,它总是返回“True” 如果您使用的shell不支持==扩展到测试,那么您的测试总是会因为语法无效而无条件失败。使用=进行字符串比较,以便可移植到所有兼容POSIX的实现中 此外,存储并比较grep的输出没有任何意义:当您的唯一目标是检查匹配数是否为零或大于零时,使用grep-q的退出状态;这允许gre
如果您使用的shell不支持
==
扩展到测试
,那么您的测试总是会因为语法无效而无条件失败。使用=
进行字符串比较,以便可移植到所有兼容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
}
仅供参考,POSIX
测试中指定的唯一字符串比较运算符是=
,而不是=
;另请参见,POSIX没有指定\n
在传递给echo
的字符串中将执行的操作(一些不兼容的echo
版本支持-e
参数,以使echo
处理此类转义;其他版本默认处理这些转义;其他版本根本不处理这些转义)。如果您想要一致的行为,请使用printf
。还要注意,您正在将字符串与int进行比较。请使用$((temp))-ne 0
,而不要使用grep-c
(或者,不使用-q
或GNU的-m1
等等效扩展名的grep
)。使用它可以强制grep
读取整个数据库.dat
来计算所有匹配项,但OP只想知道匹配项的数量是否为零——这意味着如果第一行是匹配项,grep-q
可以在看到时立即退出,而无需读取文件中的任何其他内容,然而,grep-c
仍然需要读取所有其他行以生成其计数。
# 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
}