Linux 将间隔字符串作为参数传递给函数

Linux 将间隔字符串作为参数传递给函数,linux,bash,shell,sh,Linux,Bash,Shell,Sh,我正在尝试这样的安装功能: function call_fedora(){ yum -y install $1; } function network_tools(){ tools='net-tools traceroute nmap' call_fedora $tools; } 但当我调用network\u tools函数时,只有nettools作为参数传递给call\u fedora。我希望电话是: yum -y install net-t

我正在尝试这样的安装功能:

function call_fedora(){
        yum -y install $1;
}

function network_tools(){
        tools='net-tools traceroute nmap'
        call_fedora $tools;
}
但当我调用network\u tools函数时,只有
nettools
作为参数传递给
call\u fedora
。我希望电话是:

yum -y install net-tools traceroute nmap

我建议用
$@
替换
$1
我建议用
$
替换
$1
,Bash实际上是将整个字符串
调用fedora
作为一个参数传递。据我所知,在bash中实现所需功能的一种可靠方法是使用阵列扩展:

function call_fedora(){
        yum -y install "$@"     # "$@"  means  "$1" "$2" ...
}

function network_tools(){
        tools=(net-tools traceroute nmap "some funky package with spaces")
        call_fedora "${tools[@]}"       
                # keep relationship between array elements and args of call_fedora
}
“$@”
表示
调用_fedora
的每个参数将作为单独的参数传递给
yum
。双引号表示参数可以包含空格(这是一个好习惯)

然后,您需要确保将
工具
作为单独的参数传递给
call_fedora
。使它们成为一个数组可以很容易地将它们分开。
“${tools[@]}”
将每个数组元素作为单独的参数提供,并正确地引用()


Edit正如@chepner在他的文章中指出的,这个用例有更简单、更可移植的技术。Bash实际上是将整个字符串
nettools traceroute nmap
作为一个参数传递。据我所知,在bash中实现所需功能的一种可靠方法是使用阵列扩展:

function call_fedora(){
        yum -y install "$@"     # "$@"  means  "$1" "$2" ...
}

function network_tools(){
        tools=(net-tools traceroute nmap "some funky package with spaces")
        call_fedora "${tools[@]}"       
                # keep relationship between array elements and args of call_fedora
}
“$@”
表示
调用_fedora
的每个参数将作为单独的参数传递给
yum
。双引号表示参数可以包含空格(这是一个好习惯)

然后,您需要确保将
工具
作为单独的参数传递给
call_fedora
。使它们成为一个数组可以很容易地将它们分开。
“${tools[@]}”
将每个数组元素作为单独的参数提供,并正确地引用()


Edit正如@chepner在他的文章中指出的,这个用例有更简单、更可移植的技术。

在第一个函数中用双引号(
)环绕
$1
)。在第二个函数中也用双引号环绕
$tools
。另外,我不知道为什么要用分号结束行(
)?@JonnyHenly这是正确设计函数的好建议,但这里不是这样。引用
$tools
$1
只会导致不同的不良行为。
我从一个例子@Jonny-Henly中得到,谢谢你的观点。用双引号括住
$1
)在第一个函数中。在第二个函数中也用双引号括住
$tools
。另外,我不知道为什么要用分号(
)结束行?@JonnyHenly这是正确设计函数的好建议,但这里不是这样。引用
$tools
$1
只会导致不同的不期望行为。我从一个例子@Jonny Henly得到的
,谢谢你的观点。因为
网络工具
不接受它的任何参数您也可以使用
set--net tools traceroute nmap“一些带有空格的时髦包”
,然后使用
call\u fedora“$@”
。这(除了删除不必要的
函数
关键字之外)由于
network\u tools
本身没有任何参数,您还可以使用
set--net tools traceroute nmap“一些带有空格的时髦包”
,然后是
call\u fedora“$@”
。这(除了删除不必要的
函数
关键字之外)将有助于实现与POSIX兼容的解决方案。