【发布时间】: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