我有一个包含目录名的文件:
my_list.txt:
/tmp
/var/tmp
如果目录名已经存在于文件中,我想在添加目录名之前检入Bash。
我有一个包含目录名的文件:
my_list.txt:
/tmp
/var/tmp
如果目录名已经存在于文件中,我想在添加目录名之前检入Bash。
当前回答
如果我没有理解错你的问题,这个应该可以满足你的需要。
您可以通过$check变量指定要添加的目录 如果目录已经在列表中,则输出"dir already listed" 如果目录还不在列表中,它会被追加到my_list.txt
一行:check="/tmp/newdirectory";[[-n $(grep "^$check\$" my_list.txt)]]] && echo "dir already listed" || echo "$check" >> my_list.txt
其他回答
由于某种原因,@Thomas的解决方案对我不起作用,但我有更长的字符串和特殊字符和空格,所以我只是像这样更改参数:
if grep -Fxq 'string you want to find' "/path/to/file"; then
echo "Found"
else
echo "Not found"
fi
希望它能帮助到别人
grep -Fxq "String to be found" | ls -a
Grep将帮助您检查内容 ls将列出所有的文件
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
如果您只是想检查一行是否存在,则不需要创建文件。例如,
if grep -xq "LINE_TO_BE_MATCHED" FILE_TO_LOOK_IN ; then
# code for if it exists
else
# code for if it does not exist
fi
grep -E "(string)" /path/to/file || echo "no match found"
-E选项使grep使用正则表达式