文章目录

  • 1 Overview
  • 2 Example
  • 3 StackOverflow

1 Overview

今天在看 Spark 的脚本的时候,发现很多变量都有用到 {VARIABLE+x} 这种格式,如下:

...
...
...
&& if ! [ -z ${SPARK_MOUNTED_CLASSPATH+x} ]; then SPARK_CLASSPATH="$SPARK_MOUNTED_CLASSPATH:$SPARK_CLASSPATH"; fi \
...
...
...

-z 很容易理解,在 Shell 脚本里就是表示后面这个变量是否为空,也做 zero 的意思。那后面的 +x 呢?

2 Example

以下例子是先定义了 VARIABLE 变量为空,然后判断为空的时候输出需要设置环境变量,不为空则打印变量值。

VARIABLE=
if ! [ -z ${VARIABLE} ]; thenecho "${VARIABLE} was defined"
elseecho "Need to set environment var $VARIABLE" && exit 1;
fi

显示结果如下。结果判断是正确的。

➜  /tmp cat x.sh
VARIABLE=
if ! [ -z ${VARIABLE} ]; thenecho "${VARIABLE} was defined"
elseecho "Need to set environment var $VARIABLE" && exit 1;
fi
➜  /tmp ./x.sh
Need to set environment var

然后对脚本略加修改,也就是 ${VARIABLE+x}。运行后发现,结果有点诡异,明明变量是空的,为什么会报告说变量定义了呢?

➜  /tmp cat x.sh
VARIABLE=
if ! [ -z ${VARIABLE+x} ]; thenecho "${VARIABLE} was defined"
elseecho "Need to set environment var $VARIABLE" && exit 1;
fi
➜  /tmp ./x.shwas defined

3 StackOverflow

关于以上的区别,我在 StackOverflow 上找到关键的参考信息。

https://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash

从上面的回答中可以找到相关的文档。

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02

我大概解释一下,${VARIABLE+x} 这种称为 parameter expansion,这个变量的含义是,如果 VARIABLE 是 unset 或者空的,则会用 x 来替换这个值,最后再用刚刚的例子测试一下。

➜  /tmp cat x.sh
VARIABLE=
if ! [ -z ${VARIABLE+x} ]; thenecho "${VARIABLE+x} was defined"
elseecho "Need to set environment var $VARIABLE" && exit 1;
fi
➜  /tmp ./x.sh
x was defined

可以看到 VARIABLE 为空值 null,所以会用 x 来替换 ${VARIABLE 的值,也就是说此时 ${VARIABLE}=x,所以最终会输出 x 的值。

如何判断环境变量为空相关推荐

  1. python安装环境变量出错_在windows 10上安装twisted时出错。INCLUDE环境变量为空

    我已经在我的windows机器上安装了python3.4.4,并试图在我的机器上安装twisted库.在>>>python Python 3.4.4 (v3.4.4:737efcad ...

  2. js判断一个变量为空的终极解决方案

    var item; if(typeof(item) == "undefined" || typeof(item) == "null" || item== nul ...

  3. tomcat是否有必要配置环境变量(摘)

    之前发表了一篇关于如何安装和配置Tomcat的文章,而最近在开发项目的时候总是报错.后来被公司的大神问了一句:是谁告诉你Tomcat是需要配置环境变量的? 作为新手的我瞬间整个人都不好了!于是偷偷百度 ...

  4. java环境变量一闪而过_Java环境变量配置和Tomcat启动时cmd界面一闪而过问题

    Java环境变量配置 计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量中配置Java环境变量. 配置JAVA_HOME,属于必配项,如果不配置,直接指定p ...

  5. uboot的环境变量

    注:本文是学习朱老师课程整理的笔记,基于uboot-1.3.4和s5pc11x分析. 环境变量的作用 可以不用修改uboot的源代码,而是通过修改环境变量来影响uboot运行时的一些数据和特性.譬如说 ...

  6. python os.environ.setdefault_django os.environ慎用setdefault操作环境变量

    在绝大多数情况下,如果需要在程序运行过程中设置环境变量,使用os.environ.setdefault函数是没有任何问题的,但是有两种场景下setdefault会造成意外的问题,需要慎用: 如果程序执 ...

  7. linux 环境变量导出,关于Linux:如何删除导出的环境变量?

    在安装gnuplot之前,我设置了环境变量GNUPLOT_DRIVER_DIR = /home/gnuplot/build/src.在安装过程中,出了点问题. 我想删除GNUPLOT_DRIVER_D ...

  8. python获取系统环境变量|os.environ|os.putenv|cmd添加环境变量

    文章目录 1. 背景介绍 2. python|os.environ代码 3. 添加环境变量的其他方式: 1. "系统设置"--"环境变量" 2. pycharm ...

  9. ansible踩坑——环境变量问题

    问题现象 使用ansible启动远程服务器的node服务,环境变量未被加载 本地测试打印环境变量为空 定位原因 1.环境变量问题 首先ansible使用的是ssh的方式下发命令,为no login s ...

  10. python os.environ.set_django os.environ慎用setdefault操作环境变量

    在绝大多数情况下,如果需要在程序运行过程中设置环境变量,使用os.environ.setdefault函数是没有任何问题的,但是有两种场景下setdefault会造成意外的问题,需要慎用: 如果程序执 ...

最新文章

  1. 【前端统计图】echarts实现属性修改
  2. oracle之 Got minus one from a read call 与 ORA-27154: post/wait create failed
  3. 生成n套数位加减乘除_leetcode 算法汇总(四)位运算
  4. Silverlight 入门
  5. leetcode 18 --- 4sum
  6. 删除python类中所有未使用的方法?
  7. java 非法字符: \65279
  8. poj 2378 树型dp
  9. Win10蓝牙鼠标老是断连卡顿的解决方法
  10. 阿里小姐姐工作7年,P6升P7无望,欲去当培训师
  11. Prescan(一):无人驾驶仿真软件简介
  12. C语言中callback回调函数,知识分享:C 语言函数指针之回调函数
  13. html 酷狗音乐教程,仿酷狗html5手机音乐播放器主要部分代码_html5教程技巧
  14. 不能创建对象qmdispatch_ActiveX部件不能创建对象:‘dm.dmsoft',代码:800A01AD
  15. TP-LINK三层网管交换机通过console接口完成复位操作
  16. CSS的文本属性阴影效果
  17. 冥想-提高专注力和自控力的方法
  18. 文件管理——操作系统(考研操作系统)
  19. 【记vue项目中的踩坑日记】一杯茶一包烟,一个bug搞一天
  20. 转售联通物联网卡的盈利可能性探讨

热门文章

  1. 内存颗粒与内存体质的关系
  2. mbedtls 自带SSL demo调试
  3. Docker 教程:如何将Helix QAC作为容器创建并运行 上
  4. 2022年信息系统监理师考试大纲
  5. MATLAB调用cpp文件
  6. 对Python 网络设备巡检脚本的实例讲解
  7. Python如何实现图片显示
  8. UVA 12676 Inverting Huffman
  9. 计算机组装有哪些,详解电脑组装配置有哪些
  10. python docx创建表格