1

我正在尝试编写一个 bash 脚本,以便我将用它来替换我的 egrep 命令。我希望能够采用与我的脚本完全相同的输入并将其提供给 egrep。IE

#!/bin/bash
PARAMS=$@
`egrep "$PARAMS"`

但我注意到,如果我回显我正在执行的内容,则引号已被删除,如下所示:

./customEgrep -nr "grep my ish" *

返回

egrep -nr grep my ish(来自扩展 * 的文件列表)

有没有一种方法可以让我从字面上获取输入,以便我可以直接将它与 egrep 一起使用?

4

3 回答 3

5

你要这个:

egrep "$@"

您键入的引号不会传递给脚本;它们用于确定单词边界。Using"$@"保留了这些单词边界,因此egrep将获得与直接运行它时相同的参数。echo但是,如果您提出论点,您仍然不会看到引号。

于 2013-01-26T15:59:38.543 回答
2

"是一个特殊的字符。您需要使用转义字符才能检索"

采用

./customEgrep -nr "\"grep my ish\"" *

如果您不需要在参数中做任何参数扩展,您可以使用单引号来避免需要转义双引号:

./customerEgrep -nr '"grep my ish"' *
于 2013-01-26T15:45:08.643 回答
2

$@引用时是特殊的。尝试:

value=$( egrep "$@" )

我不清楚你为什么使用 bacticks 并忽略结果,所以我使用了$()语法并分配了值。

如果出于某种原因您想保存参数以供以后使用,您还可以执行以下操作:

for i; do args="$args '$i'"; done  # Save the arguments
eval grep $args # Pass the arguments to grep without resetting $1,$2,...
eval set $args  # Restore the arguments
grep "$@"       # Use the restored arguments
于 2013-01-26T15:58:51.937 回答