我在我的代码中做了类似的事情
file_nm=`ls -latr *abc*`
if [ `grep "search_txt" "$file_nm" | wc -l` -gt 0 ]
then
echo "string found"
else
echo "string not found"
fi
如果file_nm
解析为空白,则我的代码将挂起,因为grep
预期该file_nm
为空白。我怎样才能使这段代码工作?grep
如果文件不存在,是否有任何选项可以绕过该命令?
答案1
尝试:
grep "search_txt" /dev/null "$file_nm"
即使不存在,喂入也会使它工作,因为/dev/null
总是至少有一个文件 - 这是- 可以处理。grep
$file_nm
grep
/dev/null
答案2
您可以显着简化这一点(并避免令人讨厌的问题解析 ls 所固有的)通过执行以下操作:
file_nm=$(find . -maxdepth 1 -name "*abc*");
[ -e "$file_nm" ] && grep -q "search_txt" "$file_nm" &&
echo "string found" ||
echo "string not found"
但是,就像您最初的示例一样,如果您有多个文件匹配*abc*
.所以,我会用这个:
for i in *abc*; do
grep -q "search_txt" "$i" &&
echo "string found in $i" ||
echo "string not found in $i"
done
如果您不关心多个文件中的匹配,而只想知道匹配的任何文件是否*abc*
包含该字符串search_txt
,您可以简单地执行以下操作
grep -q "search_txt" *abc* && echo "string found" || echo "string not found"
答案3
有几个问题,包括:
- 您发布的代码没有挂起
- 您使用
-l
标志 tols
,这意味着您将查找名为-rw-r--r--
等的文件 ls
您应该完全避免解析输出
并且不需要测试 的输出grep
,您只需使用退出状态即可。从man grep
:
EXIT STATUS
The exit status is 0 if selected lines are found, and 1 if not found.
这是一个执行相同操作的简化版本:
if grep -q "search_txt" *abc*
then
echo "string found"
else
echo "string not found"
fi