Answers:
grep -Fxq "$FILENAME" my_list.txt
如果找到名称,则退出状态为0(true),否则为1(false),因此:
if grep -Fxq "$FILENAME" my_list.txt
then
# code if found
else
# code if not found
fi
以下是手册页grep
的相关部分:
grep [options] PATTERN [FILE...]
-F
,--fixed-strings
将PATTERN解释为由换行符分隔的固定字符串列表,其中任何一个都要匹配。
-x
,--line-regexp
仅选择与整行完全匹配的那些匹配项。
-q
,--quiet
,--silent
安静; 不要在标准输出中写任何东西。如果发现任何匹配项,即使检测到错误,也以零状态立即退出。另请参阅
-s
或--no-messages
选项。
正如注释中正确指出的那样,以上方法默默地将错误情况视为已找到字符串。如果要以其他方式处理错误,则必须省略该-q
选项,并根据退出状态检测错误:
通常,如果找到选定的行,则退出状态为0,否则为1。但是,如果发生错误,则退出状态为2,除非使用
-q
or--quiet
或or--silent
选项并且找到选定的行。但是请注意,这只是POSIX任务,为如程序grep
,cmp
以及diff
,在错误的情况下,退出状态大于1; 因此,出于可移植性考虑,建议使用针对此一般条件进行测试的逻辑,而不是与2严格相等。
要抑制来自的正常输出grep
,可以将其重定向到/dev/null
。请注意,标准错误仍然是无向的,因此任何grep
可能打印的错误消息都将最终出现在控制台上,如您所愿。
为了处理这三种情况,我们可以使用一条case
语句:
case `grep -Fx "$FILENAME" "$LIST" >/dev/null; echo $?` in
0)
# code if found
;;
1)
# code if not found
;;
*)
# code if an error occurred
;;
esac
$?
。您还可以在if
语句旁边使用grep命令(如更新的答案所示)。
grep -Fqx "$FILENAME"
而不必担心变量内容中的正则表达式字符,也不必在搜索字符串中使用它们。
-q / --silent
是需要的吗?即使错误发生,它也会错误地说“一切都好”。如果我没错的话。在这种情况下,概念似乎有缺陷。
关于以下解决方案:
grep -Fxq "$FILENAME" my_list.txt
如果您想知道(像我一样)-Fxq
用简单的英语是什么意思:
F
:影响PATTERN的解释方式(固定字符串而不是正则表达式)x
:匹配整行q
:嘘...最少印刷从man文件中:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.
(-F is specified by POSIX.)
-x, --line-regexp
Select only those matches that exactly match the whole line. (-x is specified by POSIX.)
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit immediately with zero status if any match is
found, even if an error was detected. Also see the -s or --no-messages option. (-q is specified by
POSIX.)
我想到的三种方法:
1)对路径中的名称进行简短测试(我不确定这可能是您的情况)
ls -a "path" | grep "name"
2)对文件中的字符串进行简短测试
grep -R "string" "filepath"
3)使用正则表达式的更长的bash脚本:
#!/bin/bash
declare file="content.txt"
declare regex="\s+string\s+"
declare file_content=$( cat "${file}" )
if [[ " $file_content " =~ $regex ]] # please note the space before and after the file content
then
echo "found"
else
echo "not found"
fi
exit
如果您必须使用循环来测试文件内容上的多个字符串(例如在任何cicle上更改正则表达式),则此方法应该更快。
更简单的方法:
if grep "$filename" my_list.txt > /dev/null
then
... found
else
... not found
fi
提示:/dev/null
如果要获得命令的退出状态,请发送至,而不是输出。
-q
与--quiet
:) 相同的方式
-q
这里就最好的答案达成共识,并排在第四位。这个世界上没有正义。
如果我正确理解了您的问题,这应该做您所需要的。
一行:check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt
grep -q
并调用grep,if
就像Thomas在他的回答中所做的那样。此外,问题不包括在将目录添加到列表之前检查目录是否存在(毕竟它可能是已删除目录的列表)。
grep -E "(string)" /path/to/file || echo "no match found"
-E选项使grep使用正则表达式
无grep的解决方案对我有用:
MY_LIST=$( cat /path/to/my_list.txt )
if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
echo "It's there!"
else
echo "its not there"
fi
grep -Fxq "String to be found" | ls -a