【问题标题】:Passing spaced string as argument to function将空格字符串作为参数传递给函数
【发布时间】:2017-04-25 06:50:53
【问题描述】:

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

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

function network_tools(){
        tools='net-tools traceroute nmap'
        call_fedora $tools;
}

但是当我调用 network_tools 函数时,只有 net-tools 作为参数传递给 call_fedora。我希望电话是:

yum -y install net-tools traceroute nmap

【问题讨论】:

  • 在您的第一个函数中用双引号 (") 将 $1 括起来。还要在第二个函数中用双引号将 $tools 括起来。
  • 另外,我不知道你为什么用分号 (;) 结束行?
  • @JonnyHenly 对于正确设计的功能,这是一个很好的建议,但这里不是这样。引用 $tools$1 只会导致不同的不良行为。
  • ; 我从@Jonny Henly 的一个例子中得到,谢谢你提出的无用的观点。

标签: linux bash shell sh


【解决方案1】:

我建议将$1 替换为$@

【讨论】:

    【解决方案2】:

    Bash 实际上将call_fedora 整个字符串net-tools 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
    }
    

    "$@" 表示call_fedora 的每个参数都将作为单独的参数传递给yum。双引号表示参数可以包含空格(这是一个好习惯)。

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

    编辑正如@chepner 在他的comment below 中指出的那样,这个用例有更简单、更便携的技术。

    【讨论】:

    • 由于network_tools 自身不接受任何参数,您也可以使用set -- net-tools traceroute nmap "some funky package with spaces",后跟call_fedora "$@"。这(除了删除不必要的 function 关键字)将构成一个与 POSIX 兼容的解决方案。
    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多