我正在尝试创建一个函数,它将对作为参数发送的数组的字符串执行grep,但我无法使引号按我的意愿工作。
LOG=/tmp/log.log function grepCheck () { if grep $1 ; then STATE="true" else STATE="false" fi } possibleErrors=("string1 string1 string1" "string2 string2 string2") for checkError in ${possibleErrors[*]} do grepCheck "${possibleErrors[$checkError]} $LOG" done
输出示例:
+ LOG=/tmp/log.log
+ possibleErrors=("string1 string1 string1" "string2 string2 string2")
+ for checkError in '${possibleErrors[*]}'
+ grepCheck 'string1 string1 string1 /tmp/log.log'
+ grep string1 string1 string1 /tmp/log.log grep: string1: No such file or directory grep: string1: No such file or directory
如何让函数grep它收到的字符串?
答案 0 :(得分:2)
有意义的是你的函数接受grep
所做的相同参数。
LOG=/tmp/log.log
grepCheck () {
# Edit: use "$@"; add -q option to avoid spurious output
if grep -q "$@"; then
STATE="true"
else
STATE="false"
fi
}
possibleErrors=("string1 string1 string1" "string2 string2 string2")
for checkError in ${possibleErrors[*]}
do
# Edit: fixed quotes; pass two quoted arguments
grepCheck "${possibleErrors[$checkError]}" "$LOG"
done
如果你只关心这些字符串是否匹配,那么一次将它们全部传递给grep
会更简单。
regex=$(IFS='|'; echo "${possibleErrors[*]}")
grep -Eq "$regex" "$LOG"
答案 1 :(得分:0)
你的代码看起来有点搞笑。 grep通常需要正则表达式和文件来查找表达式。但是,在您的示例中,grepCheck被赋予一个错误字符串to-find,并有一个日志来查找它。
你有:
if grep $1 ; then
因为$ 1是不加引号的,所以shell将其扩展为grep string1 string1 string1。所以grep希望在名为string1和string1的两个文件中查找string1(基本上是相同的两个文件。)。
我想你想要以下内容:
function grepCheck () {
needle=$1
haystack=$2
if [[ -n $(grep "$needle" "$haystack") ]] ; then
STATE="true" # Error found
else
STATE="false"
fi }
然后在你的主叫代码中:
grepCheck "${possibleErrors[$checkError]}" $LOG
注意引用的变化。
答案 2 :(得分:0)
我相信你需要这样的东西:
...
for checkError in seq 0 $((${#possibleErrors[*]} - 1))
...
但这也是一个无用的数组:
for error in "string1 string1 string1" "string2 string2 string2"; do
grepCheck "$error" "$LOG"
done