【问题标题】:Shell script variable expansion with escape带转义的 Shell 脚本变量扩展
【发布时间】:2018-04-11 11:38:01
【问题描述】:

以下脚本:

#!/bin/bash

nested_func() {
    echo $1
    echo $2
}

func() {
    echo $1
    nested_func $2
}

func 1 "2 '3.1 3.2'"

输出:

1
2
'3.1

我想得到的输出是:

1
2
3.1 3.2

如何在func 上使用单个参数而不是多个参数来实现此输出?

进行编辑以解决简化问题

【问题讨论】:

  • 请拨打func 1 '2.1 2.2'。不要将两个参数作为一个字符串传递。这是一个有缺陷的要求。
  • 谢谢,我刚刚更新了问题以解决无法简化的原因。
  • 您提出了相互矛盾的要求,这可能意味着您必须手动重新堆叠并重新解析参数。重新思考您的设计。

标签: bash shell escaping parameter-passing parameter-expansion


【解决方案1】:

我有这样的预期输出:

#!/bin/bash
nested_func() {
    echo $1
    echo $2
}

func() {
    echo $1
    nested_func ${2%% *} "${2#* }"
}

func 1 "2 3.1 3.2"

使用Parameter expansion

【讨论】:

    【解决方案2】:

    你可以试试这个:

    #!/bin/bash
    
    nested_func() {
        echo "$1"
        echo "$2"
    }
    
    func() {
        nested_func "$@"
    }
    
    func 1 '2.1 2.2'
    

    $@代表给函数的所有位置参数


    您也可以使用这个:

    #!/bin/bash
    
    nested_func() {
        echo "$1"
        echo "$2"
    }
    
    func() {
        echo "$1"
        shift
        nested_func "$@"
    }
    
    func 1 2 '3.1 3.2'
    

    shift 关键字允许跳过第一个参数。

    如果您有 4 个参数,您可以轻松地映射它...

    【讨论】:

    • 感谢您的回答,我刚刚更新了问题以解决简化不起作用的原因。
    • 为什么在从funcnested_func 的一组双引号中传递时,args 仍不被视为单个字符串参数?乍一看,我希望这一切都可以放入 nested_func 的 1 美元中,尽管它运行得很好。
    • @AndrasGyomrey:这是正确的答案。在nested_func() 中,只需根据需要循环所有位置参数。它可以扩展到任意数量的参数
    • 问题是第一个参数是func,而第二个参数是nested_func 的参数列表。使用此解决方案的一种可能性是将func 期望的固定数量的参数从"$@" 中移出,将其余参数留给nested_func
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多