1

我是 bash 的新手,我正在尝试构建自己的 grep 别名来搜索文件,这是我构建的脚本:

function gia() {
  if [ -z "$1" ]; then
    echo "-You need to define what are you looking for-"
  else
    echo "-Looking for \"$1\".-"
    if [ -z $2 ]; then
      echo "-no path passed, searching all files-"
      grep -i --color "$1" ./*
    else
      echo "-Looking in \"$2\".-"
      grep -i --color "$1" $2
    fi
  fi
}

第二个选项效果不佳,如果我尝试一下,我会得到以下输出:

$$ gia 'sometext' ./*.html
-Looking for "sometext".-
-Looking in "./login.html".-

我从未指定login.html,但它获取了我目录中的一个文件并在其中进行了搜索。并且 grep 失败了。

例如,如果我在myfiles目录中有 3 个文件:

1.html2.txt3.html

和 3.html 有文本“反引号”

如果我这样搜索:

cd myfiles
gia 'backquotes'

我得到结果

-Looking for "backquotes".-
-no path passed, searching all files-
./3.html:    <backquotes>...</backquotes>

但是如果我是root用户,然后像这样搜索:

gia 'backquotes' ~/myfiles/*.html

我明白了:

-Looking for "backquotes".-
-Looking in "./1.html".-

没有结果返回,因为它只在 1.html 中搜索。如果我在 1.html 中有“反引号”。它会回来,但我没有从其他文件中得到任何东西,它只是在第一个文件中搜索并退出。

我知道星号是 bash 中的一个特殊字符,但我该如何解决呢?

提前感谢您的帮助。

EMMNS

4

2 回答 2

2

如果您要在函数中使用“通配符”文件名,则必须解析 $@。这是函数的参数列表。我暂时离开了这个解决方案的路径解析。

function gia() {
  if [ -z "$1" ]; then
    echo "-You need to define what are you looking for-"
  else
      for f in $@
      do
         grep -i --color "$f" ./*
      done
    fi
  fi
}
于 2013-03-27T18:31:26.187 回答
2

$@您可以使用${@:2}符号拼接从第 2 个开始的所有参数。还要引用,"${@:2}"因为您的文件名可以包含空格和任何需要转义的特殊字符。

这应该有效:

function gia() {
if [ -z "$1" ]; then
    echo "-You need to define what are you looking for-"
else
    echo "-Looking for \"$1\".-"
    if [ -z $2 ]; then
        echo "-no path passed, searching all files-"
        grep -i --color "$1" ./*
    else
        echo "-Looking in \"${@:2}\".-"
        grep -i --color "$1" "${@:2}"
    fi
fi
}

输出:

$ gia ABC file*.html
-Looking for "ABC".-
-Looking in "file1.html file 2.html file 3.html file4.html file5.html".-
file 2.html:ABC
file 3.html:ABC
file5.html:ABC
于 2013-03-27T20:22:38.390 回答