在shell脚本中为grep查询字符串转义变量中的方括号

时间:2015-03-18 08:01:25

标签: shell

我已经搜索了所有答案(有很多),但没有一个解决方案适用于我想要实现的代码。我遇到以下代码的麻烦:

win_string="\\\[something]\\\[somethingelse] somethingelseelse:"

# if a valid pair has been found, stop the loop 
if [ $(cat somefile.txt | grep "$win_string") != "" ];then
    echo
echo "**********WIN!**********"
    cat somefile.txt | grep "$win_string"
echo "**********WIN!**********"
echo
    exit 0 
fi

让我们说somefile.txt在每一行都包含一堆垃圾,我们正在搜索该行:

[something][somethingelse] somethingelseelse:

当我剪切并粘贴到终端时,它工作正常,但是当我把它放在一个shellcript中时,我得到以下错误:

helloworld.sh: 146: [: !=: unexpected operator

我知道它必须与我的搜索查询中的[和]有关,并且最初没有$ win_string变量,我只是添加它以尝试解决问题...

2 个答案:

答案 0 :(得分:0)

尝试存储grep的结果,然后进行if比较。

#!/bin/bash                                                      

win_string="\[something]\[somethingelse] somethingelseelse:"     

# if a valid pair has been found, stop the loop                  
result=$(cat somefile.txt | grep "$win_string")                  
if [ "$result" != "" ];then                                      
   echo "**********WIN!**********"                               
   cat somefile.txt | grep "$win_string"                         
   echo "**********WIN!**********"                               
   exit 0                                                        
fi     

在短暂的测试中,这对我有用。

答案 1 :(得分:0)

除了@ cb0的答案外,因为我确实花了一段时间寻找解决方案,所以如果您需要将字符串从传递的参数中转义到脚本,则可以使用变量替换bashism:

script.sh

#!/bin/bash                                    

result=$(cat somefile.txt | grep "${1//\[/\\[}")
if [ "${result}" != "" ];then
   echo "**********WIN!**********"
   echo "${result}"
   echo "**********WIN!**********"
   exit 0
fi

script.sh '[hello]world'