我正在使用 if-else 语句搜索关键字并在终端中显示结果,这是我的代码示例。
read finding
if ["$finding" != "" ]; then
grep $finding information.txt
else
echo "No such information in database."
fi
但是如果我输入不存在的信息,终端不会显示任何内容。我大约一周前开始使用 shell,可能需要更多关于某些代码如何工作的解释。
答案1
- 之后添加空格
[
(这是命令) - 用于
-n
测试字符串长度是否非零,或-z
测试它是否为零 - 在变量两边加上双引号
所以:
read finding
if [ -z "$finding" ]; then
echo "You didn't enter anything"
else
grep "$finding" information.txt
if [ ! "$?" -eq 0 ]; then
echo "No such information in database."
fi
fi
答案2
使用一些逻辑运算符(来自@jimmij)
grep -q "$finding" information.txt
行为类似于布尔答案(不打印任何内容,如果找到则返回状态为 0,否则返回非零)。
grep -F -- "$finding" ...
搜索文本而不是正则表达式(如果您想搜索正则表达式,请将其删除 - 可能存在一些安全风险......(谢谢@StephanChazelas))
read finding
if [ -z "$finding" ]; then
echo "You didn't enter anything"
else
grep -qF -- "$finding" information.txt && echo "found" || echo "not found"
fi
甚至
[ -z "$finding" ] &&
echo "nothing entered" ||
grep -qF -- "$finding" information.txt || echo "not found"
(但要注意,它也会运行第二个grep
和/或echo
如果第一个echo
失败)
编辑1 > explain grep -q ...
当然。
正常情况下,grep 返回状态为 0(如果发生错误(例如未找到文件),则仅返回“非 0”)
grep -qF exp file
如果在文件中找到 exp,则“返回”0,否则出错(如果regexp 与 中匹配,grep -q exp file
则会执行此操作)。exp
file
此行为可用于 bash 控制语句(if、elif、while、&&、|| 等)
read f
if [ -z "$f" ]; then
echo "You didn't enter anything"
elif grep -qF -- "$f" information.txt; then
echo "found"
else
echo "not found"
fi
答案3
i=0
until [ "$((i+=1))" -gt 5 ] || {
printf '\nPrompt: '
read finding && [ -n "$finding" ]
};do printf '\nINVALID:\tTry again.\n'
done <>/dev/tty >&0
grep -- "${finding:?INSUFFICIENT INPUT!}" <info.txt ||
! printf '%s:\tNot found in database.' "$finding" >&2
您不仅应该测试它$finding
是否不为空,而且还应该测试它是否read
成功完成 - 因此首先将其设置。上面的循环将提示并尝试从终端读取一行非空输入,然后退出并出现错误。
"${expand:?SUBSTITUTE ONLY IF UNSET OR NULL! >STDERR}"
- 的空值将作为参数扩展
$finding
的副作用进行处理,并导致写入消息并立即退出非交互式 shell。${
:?
}
stderr
- 的空值将作为参数扩展
cmd ... <redirected_input_file
- 尝试从无法打开的文件重定向是语法错误(例如不存在或有效UID/GID没有读取权限)因此,如果
info.txt
由于某种原因无效,非交互式 shell 会写入诊断消息stderr
并立即退出。如果尝试read
超出 - 影响的任何限制,这也成立ulimit
,并且同样适用于初始until ... done <>in >&out
循环。
- 尝试从无法打开的文件重定向是语法错误(例如不存在或有效UID/GID没有读取权限)因此,如果
grep ... || ! printf '%s: fmt' "$param"
- 因为任何用户或文件输入错误在调用之前已经导致 shell 退出
grep
,所以上述形式的唯一两个可能的结果是至少grep
匹配一次模式并写入相应的行,或者甚至不匹配一次并返回 0 以外的值。在后一种情况下,写入一条信息性消息并返回 1。"$finding"
stdout
printf
stderr
- 因为任何用户或文件输入错误在调用之前已经导致 shell 退出