如何将函数的所有参数传递给另一个命令?

如何将函数的所有参数传递给另一个命令?

你好,我的里面有这个~/.bash_profile

export GOPATH="$HOME/go_projects"
export GOBIN="$GOPATH/bin"

program(){
        $GOBIN/program $1
}

所以我能做到program "-p hello_world -tSu"。有没有办法在不使用引号的情况下运行程序和自定义标志?如果我这样做,program -p hello_world -tSu它只会使用该-p标志,并且空格后面的所有内容都将被忽略。

答案1

programshell 函数中,使用"$@"来引用赋予该函数的所有命令行参数的列表。使用引号,给定的每个命令行参数program将另外单独引用(您通常需要这样)。

program () {
    "$GOBIN"/program "$@"
}

然后你可以program像这样调用:

program -p hello_world -tSu

或者,如果您想通过hello world而不是hello_world

program -p 'hello world' -tSu

正如您所注意到的,使用$1仅指第一个命令行参数(并且$2将指第二个等)。的值$1将另外在空格上分割,并且每个生成的字符串将经历文件名通配,因为扩展是不带引号的。这将导致无法正确地将包含空格或文件名通配模式的参数传递给函数。

答案2

"$@"是提供传递函数/脚本收到的所有参数的方法,正如 Kusalananda 所回答的那样。

$GOBIN但是,鉴于您似乎在 go 程序中使用文件夹,我认为只需将文件夹添加到 PATH 中会更好:

export GOPATH="$HOME/go_projects"
export GOBIN="$GOPATH/bin"
export PATH="$PATH:$GOBIN"

这样,您$GOBIN只需输入名称即可运行存储在其中的任何程序(除非它与现有程序具有相同的名称,否则我们将追加$GOBIN 到 $PATH,因此将选择这些程序最后的)。

PS:为了完整起见,还有第三个选项,即使用别名而不是函数,您可以将其放置在.bashrc

alias program="$GOBIN/program"

答案3

对我有用的是以下内容:

m() {
    args="$@"
    usql mysql://root@localhost:3306 -c $args
}

这实际上在我的命令末尾放置了一组带引号的参数,这样我就可以运行如下命令:

m show databases;

它实际上运行了

usql mysql://root@localhost:3306 -c "show databases;"

相关内容