Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 条件评估为;“真的”;_Shell_Unix_If Statement_Scripting - Fatal编程技术网

Shell 条件评估为;“真的”;

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脚本检查数据库中的重复记录。 为此,我创建了一个名为“check()”的函数,它的echo值为True或False,并存储在变量“result”中。但在使用if语句求值时,它总是返回“True”


如果您使用的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
}