我想用很多标志运行管道到fgrep:
echo "hi" | fgrep -e hi -e bye -e don ...
为此,我想预先创建包含标志和字符串的字符串。基本上,我试图这样做:
STR="-e hi"
STR="${STR} -e bye"
echo "nihibyehi\nhello\nhi" | fgrep ${=STR}
但是我收到以下错误:
${=STR}: bad substitution
有一种方法可以通过fgrep以这种方式完成此操作(使用“fgrep $ {= STR}”)。它是什么?
答案 0 :(得分:2)
<强>更新强>:
OP显然使用zsh
,但仅将问题标记为shell
(建议POSIX兼容性)。
可能发生的事情是他/她尝试使用不同的 shell运行上述zsh
特定代码,导致bad substitution
错误 - {{1}例如,会给出错误。
使用bash
运行时,上述代码可以正常工作 - 它使用zsh
的字符串拆分标记zsh
将=
的内容分解为单个字词 - 但它没有很好地概括:
例如,如果搜索字符串有嵌入空格,解决方案就会中断。
以下是更强大的解决方案,适用于$STR
以及zsh
,以及POSIX兼容shell的解决方案。
假设您使用 bash 或 zsh :
使用数组构建参数列表,然后将整个数组双引号传递给bash
:
fgrep
对于与POSIX兼容的shell (如果使用STR=('-e' 'hi')
STR+=('-e' 'bye')
printf 'nihibyehi\nhello\nhi\n' | fgrep "${STR[@]}"
或bash
不是一个选项),您可以将搜索字符串写入(临时)文件并使用zsh
选项将其传递给-f
:
fgrep