我正在努力传递变量中包含的几个grep模式。这是我的代码:
#!/bin/bash
GREP="$(which grep)"
GREP_MY_OPTIONS="-c"
for i in {-2..2}
do
GREP_MY_OPTIONS+=" -e "$(date --date="$i day" +'%Y-%m-%d')
done
echo $GREP_MY_OPTIONS
IFS=$'\n'
MYARRAY=( $(${GREP} ${GREP_MY_OPTIONS} "/home/user/this path has spaces in it/"*"/abc.xyz" | ${GREP} -v :0$ ) )
这就是我想要的:
当我使用“echo $ GREP_MY_OPTIONS”时,它会产生我的预期,但是当我运行脚本时它失败并出现以下错误:
/ bin / grep:无效选项 - ''
我做错了什么?如果路径中没有空格,一切似乎都能正常工作,所以我认为这与IFS有关,但我不确定。
答案 0 :(得分:3)
如果您想要grep
一组路径中的某些内容,您可以执行以下操作:
find <directory> -type f -print0 |
grep "/home/user/this path has spaces in it/\"*\"/abc.xyz" |
xargs -I {} grep <your_options> -f <patterns> {}
因此<patterns>
是一个文件,其中包含您要在directory
的每个文件中搜索的模式。
考虑到你的答案,这应该做你想要的:
find "/path\ with\ spaces/" -type f | xargs -I {} grep -H -c -e 2013-01-17 {}
来自man grep
:
-H, --with-filename
Print the file name for each match. This is the default when
there is more than one file to search.
由于您要将元素插入到数组中,因此可以执行以下操作:
IFS=$'\n'; array=( $(find "/path\ with\ spaces/" -type f -print0 |
xargs -I {} grep -H -c -e 2013-01-17 "{}") )
然后将值用作:
echo ${array[0]}
echo ${array[1]}
echo ${array[...]}
使用变量传递参数时,使用eval
来评估整行。执行以下操作:
parameters="-H -c"
eval "grep ${parameters} file"
答案 1 :(得分:1)
如果您将GREP_MY_OPTIONS构建为数组而不是简单字符串,则可以使原始大纲脚本合理地工作:
#!/bin/bash
path="/home/user/this path has spaces in it"
GREP="$(which grep)"
GREP_MY_OPTIONS=("-c")
j=1
for i in {-2..2}
do
GREP_MY_OPTIONS[$((j++))]="-e"
GREP_MY_OPTIONS[$((j++))]=$(date --date="$i day" +'%Y-%m-%d')
done
IFS=$'\n'
MYARRAY=( $(${GREP} "${GREP_MY_OPTIONS[@]}" "$path/"*"/abc.xyz" | ${GREP} -v :0$ ) )
我不清楚为什么你使用GREP="$(which grep)"
,因为你将执行相同的grep
,就像你直接写grep
一样 - 除非,我想,你有{{1}的别名1}}(这就是问题;不要别名grep
)。
答案 2 :(得分:0)
你可以做一件事而不会让事情变得复杂:
首先在脚本中执行更改目录,如下所示:
cd /home/user/this\ path\ has\ spaces\ in\ it/
$ pwd
/home/user/this path has spaces in it
或
$ cd "/home/user/this path has spaces in it/"
$ pwd
/home/user/this path has spaces in it
然后在你的剧本中做你想做的事。
$(${GREP} ${GREP_MY_OPTIONS} */abc.xyz)
编辑:
[sgeorge@sgeorge-ld stack1]$ ls -l
total 4
drwxr-xr-x 2 sgeorge eng 4096 Jan 19 06:05 test tesd
[sgeorge@sgeorge-ld stack1]$ cat test\ tesd/file
SUKU
[sgeorge@sgeorge-ld stack1]$ grep SUKU */file
SUKU
编辑:
[sgeorge@sgeorge-ld stack1]$ find */* -print | xargs -I {} grep SUKU {}
SUKU