我有一个包含目录名的文件:

my_list.txt:

/tmp
/var/tmp

如果目录名已经存在于文件中,我想在添加目录名之前检入Bash。


当前回答

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[选项]模式[文件…] - f, fixed-strings 将PATTERN解释为一个由换行符分隔的固定字符串列表,其中任何一个都要匹配。 - x, line-regexp 只选择与整行完全匹配的匹配项。 -q,——安静,——沉默 安静的;不要向标准输出写入任何内容。如果发现任何匹配,即使检测到错误,也立即以零状态退出。还请参阅-s或——no-messages选项。

错误处理

正如评论中正确指出的那样,上述方法将错误情况默默地处理,就像找到字符串一样。如果你想以不同的方式处理错误,你必须忽略-q选项,并根据退出状态检测错误:

正常情况下,如果找到选定的行,退出状态为0,否则为1。但是,如果发生错误,则退出状态为2,除非使用-q或——quiet或——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

其他回答

最简单的方法是:

isInFile=$(cat file.txt | grep -c "string")


if [ $isInFile -eq 0 ]; then
   #string not contained in file
else
   #string is in file at least once
fi

Grep -c将返回该字符串在文件中出现的次数。

更简单的方法:

if grep "$filename" my_list.txt > /dev/null
then
   ... found
else
   ... not found
fi

提示:如果你想要命令的退出状态,发送到/dev/null,而不是输出。

与其他答案略有相似,但没有分叉,条目可以包含空格

contains() {
    [[ " ${list[@]} " =~ " ${1} " ]] && echo 'contains' || echo 'does not contain'
}

IFS=$'\r\n' list=($(<my_list.txt))

对于my_list。txt

/tmp
/var/tmp
/Users/usr/dir with spaces

这些测试

contains '/tmp'
contains '/bin'
contains '/var/tmp'
contains '/Users/usr/dir with spaces'
contains 'dir with spaces'

返回

exists
does not exist
exists
exists
does not exist
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[选项]模式[文件…] - f, fixed-strings 将PATTERN解释为一个由换行符分隔的固定字符串列表,其中任何一个都要匹配。 - x, line-regexp 只选择与整行完全匹配的匹配项。 -q,——安静,——沉默 安静的;不要向标准输出写入任何内容。如果发现任何匹配,即使检测到错误,也立即以零状态退出。还请参阅-s或——no-messages选项。

错误处理

正如评论中正确指出的那样,上述方法将错误情况默默地处理,就像找到字符串一样。如果你想以不同的方式处理错误,你必须忽略-q选项,并根据退出状态检测错误:

正常情况下,如果找到选定的行,退出状态为0,否则为1。但是,如果发生错误,则退出状态为2,除非使用-q或——quiet或——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
grep -Fxq "String to be found" | ls -a

Grep将帮助您检查内容 ls将列出所有的文件