【问题标题】:BASH using double variable $ - bad substitution [duplicate]BASH使用双变量$ - 错误替换[重复]
【发布时间】:2014-02-05 00:38:21
【问题描述】:

从我下面的代码中,如何在变量 'yy' 上用 x 替换 'critical_' 后使 'zz' 的值变为 500

xab123=500

yy="critical_ab123"
zz=${"${yy//critical_/x}"}

echo $zz

反而是结果,有错误:

line 8: ${"${yy//critical_/x}"}: bad substitution

谢谢 阿迪

【问题讨论】:

    标签: bash variables substitution


    【解决方案1】:

    可能是这样的:

    xab123=500
    yy="critical_ab123"
    zz="${yy//critical_/x}"
    echo ${!zz}
    500
    

    【讨论】:

    • 谢谢,正在工作
    • 不客气,很高兴它成功了。
    【解决方案2】:

    一个有趣的用法是,当您调用 bash 函数时,您可以对传入的参数使用间接。然后,您可以使用命令替换以嵌套方式嵌套对间接函数的调用。

    deref() { echo "${!1}"; }
    
    aa="bb"
    bb="cc"
    cc="hello"
    
    echo "$(deref aa)" # bb
    echo "$(deref "$(deref aa)")" # cc
    echo "$(deref "$(deref "$(deref aa)")")" # hello
    

    这里是deref用来解决OP的问题:

    deref() { echo "${!1}"; }
    
    xab123="500"
    yy="critical_ab123"
    zz="$(deref "${yy//critical_/x}")"
    
    echo "$zz" # Outputs: 500
    

    基于@charles-duffy cmets 的应用编辑:

    1. 免责声明:读者请注意,此方法中使用的命令替换(FIFO 创建、子外壳的 fork()、read() 和 wait())会影响性能。
    2. 添加引号以防止有损扩展,即echo "$zz" 优于echo $zz
    3. 使用符合 POSIX 的函数声明语法,即将 function deref { echo "${!1}" ; } 替换为 deref() { echo "${!1}" ; }
    4. 更正了每个引用上下文的引用问题

    【讨论】:

    • 嘘,嘶嘶声:命令替换是不必要的,并且会对性能产生重大影响(需要创建 FIFO,fork() 的子外壳,read()wait() 相同),缺少引用使得这有损(echo $zz 将用当前目录中的文件列表替换 *),并且非标准函数声明语法与 POSIX 兼容的替代方案相比绝对没有优势。
    • @charles-duffy 我理解您的反馈。我考虑删除这个答案,但是,我决定尝试改进它。我相信我正确理解了您的观点,但我未能理解非标准函数声明。可以提供参考吗?
    • 参见pubs.opengroup.org/onlinepubs/9699919799/utilities/… 的相关标准文档——符合标准的定义是deref() { echo "${!1}"; },前面没有function 关键字。
    • 顺便说一句,正确的引用(以确保我们将修改 yy 的结果作为单个参数传递,无论是否存在空格或 IFS 的值)将是 zz="$(deref "${yy//critical_/x}")" -- 每个用$() 替换命令会启动一个新的引用上下文。这样,使用yy='hello world' 调用将正确地导致错误,而不是取消名为hello 的变量并默默地忽略world
    • (类似:"$(deref "$(deref "$(deref aa)")")"
    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多