【问题标题】:Set bash variable one liner from if else [duplicate]将bash变量设置为if else [重复]
【发布时间】:2021-12-28 14:56:32
【问题描述】:
TOKEN=$(if [[ $TOKEN ]] then echo $TOKEN else cat ./cloud/token fi)

所以我正在尝试设置变量TOKEN。这可能是之前设置的,在这种情况下,我希望使用该值,如果没有,我希望通过 catting 文件来分配它。

由于我缺乏 bash 技能,上述方法不起作用!

【问题讨论】:

  • 你的代码是正确的,你只是没有添加;。这应该工作TOKEN=$(if [[ $TOKEN ]]; then echo $TOKEN; else cat ./cloud/token; fi)

标签: bash


【解决方案1】:
TOKEN=$(if [ -z "${TOKEN}" ]; then cat ./cloud/token; else echo "${TOKEN}"; fi)

-z 条件检查变量是否为空或是否分配了任何值。如果满足条件(即变量为空),则意味着它必须从./cloud/token 文件中查找值。如果条件失败,则表示该值已被赋值,因此它会回显该变量。

【讨论】:

    【解决方案2】:

    在这种特殊情况下,我会使用 参数替换 并指定一个在未定义变量时使用的默认值:

    TOKEN=${TOKEN-$(< ./cloud/token)}
    

    【讨论】:

    • 这个问题是你每次都在运行cat,不管TOKEN是否为空。如果默认值是文字字符串很好,但一般来说,不是命令子。
    • 嗯,我刚刚尝试过,如果未定义 TOKEN 变量,我发现它不会访问令牌文件。使用 bash 5.1.0 测试。
    • 我认为你的意思是 is 已定义,但抱歉我错了。我一直认为命令潜艇首先由 shell 扩展,但在这里它们的处理方式不同。我在POSIX 2018:In this example, ls is executed only if x is null or unset ${x:-$(ls)} 中找到了清晰的文档。我使用${foo-$(sleep 1)} 验证了冒号和没有冒号。
    • 这是一个UUOC案例,因为Bash在没有cat:TOKEN=${TOKEN-$(&lt; ./cloud/token)}的情况下总是可以读取文件
    • 另一个旁注::- 版本在某些情况下可能更合适。 TOKEN=${TOKEN:-$(&lt; ./cloud/token)}man 页面包含所有详细信息。
    【解决方案3】:

    你可以使用:

    : ${TOKEN:=$(cat ./cloud/token)}
    

    【讨论】:

      【解决方案4】:

      您可以通过使用 bash 对默认参数值的支持来简化此操作。来自 bash 文档:

         ${parameter:-word}
                Use Default Values.  If parameter is unset or null, the expansion of 
                word is substituted.  Otherwise, the value of parameter is substituted.
      

      对于您的示例,您可以这样做:

      TOKEN=${TOKEN:-$(cat ./cloud/token)}
      

      【讨论】:

      • 哇哦哦,看起来真的很优雅!
      【解决方案5】:

      我认为分号是必要的。

      TOKEN=$(if [[ $TOKEN ]]; then echo $TOKEN; else cat ./cloud/token; fi)
      

      【讨论】:

        【解决方案6】:
        TOKEN=$([ -n "$TOKEN" ] && echo "$TOKEN" || cat ./cloud/token)
        

        【讨论】:

        • 这在这里有效,但模式可能有点奇怪,因为在某些情况下bash 会同时执行两者(例如,如果不是echo,它可能会失败)
        • 你可以使用&amp;&amp; (something-that-fails-but-output-something; true)
        猜你喜欢
        • 2015-05-24
        • 2021-09-14
        • 1970-01-01
        • 2021-10-20
        • 2016-06-26
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2017-04-26
        相关资源
        最近更新 更多