【问题标题】:Expand a variable in a variable in Bash在 Bash 中的一个变量中展开一个变量
【发布时间】:2014-09-12 17:12:12
【问题描述】:

我有一个脚本,我需要传递一个包含变量和文本的字符串以符合 URI。

这方面的一个例子是:

URI="${PROTO}://${USER}:${PASS}@${HOST}/${TARGET}"

变量${PROTO}${USER}${PASS}${HOST}${TARGET} 在我定义变量$URI 时未定义,但它们将在Bash 脚本执行时定义,所以我需要将 URI 扩展为字符串的最终形式。

我该怎么做?我已经阅读了eval: When You Need Another Chance,但我真的不喜欢使用 eval 的想法,因为它可能很危险,而且它意味着要转义 URI 字符串的很多部分。

还有其他方法吗?这个问题的推荐解决方案是什么?

谢谢 M

【问题讨论】:

    标签: bash shell variables scripting


    【解决方案1】:

    变量存储数据;如果您没有 PROTO 等的值。然而,那么你没有数据。你需要一个模板。

    uri_template="%s://%s:%s@%s/%s"
    

    稍后,当您确实拥有其余数据时,您可以将它们插入到模板中。

    uri=$(printf "$uri_template" "$PROTO" "$USER" "$PASS" "$HOST" "$TARGET")
    

    (在bash 中,您可以使用-v 选项避免命令替换中的fork:printf -v uri "$uri_template" "$PROTO" "$USER" "$PASS" "$HOST" "$TARGET"。)

    你也可以定义一个函数:

    uri () {
        # I'm being lazy and assuming uri will be called with the correct 5 arguments
        printf "%s://%s:%s@%s/%s" "$@"
    }
    
    # Variables and functions exist in separate namespaces, so the following works
    uri=$(uri "$PROMPT" "$USER" "$PASS" "$HOST" "$TARGET")
    

    【讨论】:

    • 我可以根据您的回答找到合适的解决方案,但以防万一我想进一步解释我的问题,看看您能否提出与我不同的解决方案思维。 URI 可以带有变量或已经带有值。所以我不能直接做你提出的解决方案。我想我可以匹配一个regesxp if 和哪些变量,然后根据结果做你说的。
    【解决方案2】:

    在执行脚本之前,使用'export'定义变量。

    export PROTO='http'
    export USER='bob'
    export PASS='password'
    export HOST='myhostname'
    export TARGET='index.html'
    
    bash ./myscript_with_uri.sh
    

    将 URI 脚本创建为将返回 URI 的过程。

    uri_creater.sh

    makeUri ()
    {
        URI="${PROTO}://${USER}:${PASS}@${HOST}/${TARGET}
    }
    

    script_using_uri.sh

    . uri_creater.sh
    PROTO='http'
    USER='bob'
    PASS='password'
    HOST='myhostname'
    TARGET='index.html'
    
    makeUri
    
    url="${URI}"
    
    echo "${url}"
    

    使用 bash 在 Centos 6.5 上测试。

    【讨论】:

    • 1) 'export' 命令使变量可用于子 shell。 2) '.'导致脚本被导入 3) 变量在使用时被评估。只要在评估之前设置它们,它就会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2019-11-24
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多