V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
DinoStray
V2EX  ›  问与答

shell 脚本探测变量是否为空, 为什么要加个前缀

  •  
  •   DinoStray · 2020-09-12 16:58:41 +08:00 · 1305 次点击
    这是一个创建于 1320 天前的主题,其中的信息可能已经有所发展或是发生改变。
    if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
        export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
    fi
    

    这个 shell 脚本, if 语句, 是想探测环境变量是否为空, 为啥不直接

    if [ "$KAFKA_HEAP_OPTS" = "" ]
    

    而是在前面加了个 x

    5 条回复    2020-09-12 22:40:49 +08:00
    lcdtyph
        1
    lcdtyph  
       2020-09-12 17:10:46 +08:00 via iPhone
    为了兼容性,一些 shell 的实现无法正确处理 [ -n = "" ] 这种情况,当你测试的那个变量个是比较特殊(比如"-n")在某些 shell 下会出错
    wd
        2
    wd  
       2020-09-12 17:20:02 +08:00 via iPhone
    陈年陋习 老版本(很老的那种,我感觉我很早就看到这个写法了) bash 可能会有问题吧
    love
        3
    love  
       2020-09-12 20:26:12 +08:00
    不是应该 [[ -z $a ]] && echo empty || echo notempty
    laycher
        4
    laycher  
       2020-09-12 21:43:30 +08:00
    @love #3 我也觉得是这种写法。不是-z 判断的吗?
    SiliusMo
        5
    SiliusMo  
       2020-09-12 22:40:49 +08:00 via Android
    前缀是为了防止一些 shell 在变量未定义的情况下省略这个变量而不是替换为空字符串,从而使代码变为 `if [ = x ]` 。这样会报 参数过少 的错误。

    然而把变量都用双引号括起来已经解决了这个问题…所以楼主说的第二种情况是完全可以的,这里加前缀 x 应该是多余的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3190 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:37 · PVG 22:37 · LAX 07:37 · JFK 10:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.