我想使用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
}
答案 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
}