我如何从字面上理解shell输入? (即保持报价等完整)

时间:2013-01-26 15:41:49

标签: bash shell unix grep

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

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

但是我注意到如果我回应我正在执行的内容,那么引号已被删除如下:

  

./ customEgrep -nr“grep my ish”*

返回

  

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

有没有办法让我可以直接输入输入,以便我可以直接使用egrep?

3 个答案:

答案 0 :(得分:5)

你想要这个:

egrep "$@"

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

答案 1 :(得分:2)

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

使用

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

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

./customerEgrep -nr '"grep my ish"' *

答案 2 :(得分: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