【发布时间】:2013-01-03 01:44:20
【问题描述】:
我正在努力传递变量中包含的几个 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$ ) )
这就是我想要它做的事情:
- 确定/定义 grep 的位置
- 分配一个变量 (GREP_MY_OPTIONS) 保存我将传递给 grep 的参数
- 将多个模式分配给 GREP_MY_OPTIONS
- 使用 grep 和我存储在 $GREP_MY_OPTIONS 中的模式搜索包含空格的路径中的多个文件并将它们保存在一个数组中
当我使用“echo $GREP_MY_OPTIONS”时,它正在生成我所期望的,但是当我运行脚本时它失败并出现以下错误:
/bin/grep: 无效选项 -- ' '
我做错了什么?如果路径中没有空格,一切似乎都可以正常工作,所以我认为这与 IFS 有关,但我不确定。
【问题讨论】:
-
您是否介意:
echo "${GREP} ${GREP_MY_OPTIONS} \"/home/user/this path has spaces in it/\"*\"/abc.xyz\" | ${GREP} -v :0$",看看将要执行的实际命令是什么? -
这产生了:/bin/grep -c -e 2013-01-17 -e 2013-01-18 -e 2013-01-19 -e 2013-01-20 -e 2013-01 -21 -e 2013-01-22 -e 2013-01-23 -e 2013-01-24 -e 2013-01-25 "/home/user/这个路径里面有空格/"*"/abc.xyz " | /bin/grep -v :0$
-
在风格上,环境变量最好使用大写的变量名,一般使用的变量名使用小写。然后脚本中的 SHOUTING 就更少了。就个人而言,我可能会使用
$opts之类的东西来代替$GREP_MY_OPTIONS;我也尽可能避免在代码中使用“我的”这个词(实际上大多数时候),但这是我的问题。最后(目前),如果我可能需要使用不同的grep程序,我通常使用:grep="${GREP:-grep}",它允许环境变量 GREP 覆盖默认值。我在测试时使用date做到了这一点。
标签: arrays bash design-patterns grep ifs