我有一个像这样的文件
文件名:hello.txt
{1:ABC}{2:BCD}{3:{108:20140619-2}}{4:
:97A::Hi//12345
:97A::Hi//12345
:93B::Hello//FAMT/00000,
:16S:FIN
-}{5:{CHK:BDG6789}}{S:{ABC:}{DEF:S}{WOM:ONHGRT}}
现在基本上我正在检查是否存在$符号,以及:97A:并使用下面的if语句进行操作。
if [ `grep -c '\$' hello.txt` -gt 0 ] && [ `grep -c ":97A:" hello.txt` -gt 1 ]
then
echo "condition satisfied"
else
echo "condition not satisfied"
fi
如果我执行此im获取条件令人满意的echo语句。但是id应该是相反的方式:(因为即时通讯和条件。请帮忙。
答案 0 :(得分:1)
将grep -c '\$' hello.txt
替换为grep -c '\\$' hello.txt
然后它将按照需要运行。
例如:
bash -x test.sh
++ grep -c '\$' hello.txt
+ '[' 0 -gt 0 ']'
+ echo 'condition not satisfied'
condition not satisfied
PS:bash -x是你的朋友:)
答案 1 :(得分:1)
我建议使用grep
语法在子shell中执行$
命令,然后进行比较。在我看来,这是一种更清洁的方式,并要求你不要成为逃避艺术家。
if [ $(grep -c '\$' hello.txt) -gt 0 ] && [ $(grep -c ":97A:" hello.txt) -gt 1 ]
then
echo "condition satisfied"
else
echo "condition not satisfied"
fi
对于hello.txt
,输出将是:
>> bash test.bash
condition not satisfied
由于您的文件中没有美元符号
[ $(grep -c '\$' hello.txt) -gt 0 ]
将测试
[ 0 -gt 0 ]
并且产生错误,而
[ $(grep -c ':97A' hello.txt) -gt 1 ]
将测试
[ 2 -gt 1 ]
并且产生真实。最后,假和&& true将产生false,第二个echo语句将被执行。
答案 2 :(得分:1)
我也不了解你的问题,但是根据你的代码,我得出的结论是你在为美元符号而烦恼。我想如果你使用反引号你也需要逃避反斜杠:
$ echo 'foo$bar' > dollar.txt
$ echo 'foo_bar' > no_dollar.txt
$ [ `grep -c '\$' dollar.txt` -gt 0 ] && echo 1
1
$ [ `grep -c '\$' no_dollar.txt` -gt 0 ] && echo 1
1
$ [ `grep -c '\\$' dollar.txt` -gt 0 ] && echo 1
1
$ [ `grep -c '\\$' no_dollar.txt` -gt 0 ] && echo 1
$ [ `grep -c '\\$' no_dollar.txt` -gt 0 ] || echo 0
0
或者,使用$()
代替反引号
答案 3 :(得分:1)
“我正在检查是否存在$符号”
第一个条件不匹配,因为输入中的任何地方都没有“$”符号,因此第一个grep的输出为0.当0不大于0时,结果为“false”。因此,第二个条款根本不会被执行。 “条件不满足”,因为您对“满意”的要求是:输入包含“$”和“:97A:”。
对于grep是否匹配任何一行的结果,您不需要计算匹配数。
if grep -q '\$' file; then ...
是一种在没有rube-goldbergismns的条件语句中使用grep结果的方法
答案 4 :(得分:1)
使用awk
并仅读取一次文件:
if awk '/[$]/{d++} /:97A:/{o++} END{exit !(d && o>1)}' hello.txt; then
echo "condition satisfied"
else
echo "condition not satisfied"
fi