Bash别名和bash函数有几个参数

时间:2012-06-09 07:33:36

标签: bash

我想使用bash别名和bash函数与几个参数。我模仿svn子命令。

$ svngrep -nr 'Foo' .
$ svn grep -nr 'Foo' .

我的期望是如下:

grep --exclude='*.svn-*' --exclude='entries' -nr 'Foo' .

但实际上,只有别名('svngrep')运行良好,函数('svn grep')会导致无效选项错误。如何写我的.bashrc?

#~/.bashrc

alias svngrep="grep --exclude='*.svn-*' --exclude='entries'"

svn() {
  if [[ $1 == grep ]]
then
  local remains=$(echo $@ | sed -e 's/grep//')
  command "$svngrep $remains"
else
  command svn "$@"
fi
}

3 个答案:

答案 0 :(得分:2)

您希望shift从位置参数中删除第一个单词:这样可以保留"$@"的类似数组的性质。

svn() {
  if [[ $1 = grep ]]; then
    shift
    svngrep "$@"
  else
    command svn "$@"
  fi
}

使用bash的[[内置,单=用于字符串相等,双==用于模式匹配 - 在这种情况下你只需要前者。

答案 1 :(得分:0)

svngrep不是变量。它是bash使用的别名。因此必须创建一个新变量,如:

svngrep_var="grep --exclude='*.svn-*' --exclude='entries'"

并在您的代码段中使用它:

...
command "$svngrep_var $remains"
...

答案 2 :(得分:0)

我自己重新考虑这一点。工作正常!谢谢!

#~/.bashrc
alias svngrep="svn grep"
svn() {
if [[ $1 == grep ]]
then
    local remains=$(echo $* | sed -e 's/grep//')
    command grep --exclude='*.svn-*' --exclude='entries' $remains
else
  command svn $*
fi
}

我选择保持别名简单。我使用$ *而不是$ @。

编辑:2012-06-11

#~/.bashrc
alias svngrep="svn grep"
svn() {
  if [[ $1 = grep ]]
  then
    shift
    command grep --exclude='*.svn-*' --exclude='entries' "$@"
  else
    command svn "$@"
  fi
}