我正在处理一个带有1个字符串参数和一个文件的脚本。我想要这样,如果放置的文件不存在,则会显示“ 文件名无法读取”消息。
该部分确实起作用,但是它还会显示“ grep:grep.txt:无此类文件或目录”消息。如果第一个if语句为true,是否可以阻止grep消息发布和结束脚本?
#! /bin/sh
if [ ! -f "$2" ]
then
echo "$0" cannot be read 1>&2
fi
if [ $# -eq 2 ]
then
grep "$1" $2
else
echo there is more or less than 2 arguments 1>&2
fi
答案 0 :(得分:0)
您可以在grep命令中添加/ dev / null,它将消除错误部分。
grep "$1" $2 2>/dev/null
>运算符通常将输出重定向到文件,但可以重定向到设备。您还可以使用>>进行追加。
2> file
将stderr重定向到文件
/ dev / null是空设备,它将接收您想要的任何输入并将其丢弃。可用于抑制任何输出。
答案 1 :(得分:0)
使用非零退出代码退出脚本以指示失败,并阻止脚本继续进行到grep
。
if [ ! -f "$2" ]
then
echo "$0" cannot be read 1>&2
exit 1
fi
答案 2 :(得分:0)
您可以重定向grep中的所有错误,例如:
grep "$1" $2 2>/dev/null
(2>
表示重定向标准错误,与>
或1>
的标准输出相反)。
但是,这引入了竞争条件:如果文件在脚本运行时消失了,那么当您检查文件是否存在时该文件可能仍然存在,但是在grep
运行时就消失了。
您可以通过检查退出状态来解决此问题...
grep "$1" $2 2>/dev/null
if [[ $? -gt 1 ]]; then
echo "grep failed unexpectedly" >&2
fi
恕我直言,在此示例中,最好让grep
打印错误。