为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查在Bash中是否设置了变量?

如何检查在Bash中是否设置了变量?

蓝山帝景 2019-06-24 13:35:29
如何检查在Bash中是否设置了变量?我如何知道是否在Bash中设置了一个变量?例如,如何检查用户是否向函数提供了第一个参数?function a {     # if $1 is set ?}
查看完整描述

3 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

(通常)正确的方法

if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi

哪里${var+x}参数展开如果var未设置,并替换字符串。x不然的话。

引号离题

引号可以省略(所以我们可以说${var+x}而不是"${var+x}")因为这种语法和用法保证了这只会扩展到不需要引号的东西(因为它可以扩展到x(它不包含分词,因此不需要引号),或者不包含(结果是[ -z  ],它方便地计算出与以下值相同的值(True):[ -z "" ])。

然而,虽然可以安全地省略引号,但并不是所有人都立即明白这一点(甚至不是显而易见的)。本引文的第一作者解释也是一个主要的bash编码器),有时用引号编写解决方案会更好[ -z "${var+x}" ],以极小的O(1)速度惩罚代价。第一个作者还在代码旁边添加了这个注释,使用这个解决方案给出了这个答案的URL,这现在还包括了为什么可以安全地省略引号的解释。

(经常)走错了路

if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi

这通常是错误的,因为它没有区分未设置的变量和设置为空字符串的变量。也就是说,如果var='',则上述解决方案将输出“var是空”。

在用户必须指定扩展或附加属性列表的情况下,Unset和“设置为空字符串”之间的区别是非常重要的,而不指定这些属性的默认值为非空值,而指定空字符串应使脚本使用空扩展名或附加属性列表。

然而,这种区别在每一种情况下都可能是必要的。在这些情况下[ -z "$var" ]一切都会好起来的。


查看完整回答
反对 回复 2019-06-24
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

若要检查非空/非零字符串变量,即如果设置,请使用

if [ -n "$1" ]

正好相反-z..我发现自己-n多过-z.

你会把它当作:

if [ -n "$1" ]; then
  echo "You supplied the first parameter!"else
  echo "First parameter not supplied."fi


查看完整回答
反对 回复 2019-06-24
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

下面是如何测试参数是否是未定,或空(“空”)或用值设置:


+--------------------+----------------------+-----------------+-----------------+

|                    |       parameter      |     parameter   |    parameter    |

|                    |   Set and Not Null   |   Set But Null  |      Unset      |

+--------------------+----------------------+-----------------+-----------------+

| ${parameter:-word} | substitute parameter | substitute word | substitute word |

| ${parameter-word}  | substitute parameter | substitute null | substitute word |

| ${parameter:=word} | substitute parameter | assign word     | assign word     |

| ${parameter=word}  | substitute parameter | substitute null | assign word     |

| ${parameter:?word} | substitute parameter | error, exit     | error, exit     |

| ${parameter?word}  | substitute parameter | substitute null | error, exit     |

| ${parameter:+word} | substitute word      | substitute null | substitute null |

| ${parameter+word}  | substitute word      | substitute word | substitute null |

+--------------------+----------------------+-----------------+-----------------+

资料来源:POSIX:参数展开式:

在以“替代”表示的所有情况下,表达式都将替换为所显示的值。在所有用“赋值”显示的情况下,都为参数赋值,这也替换了表达式。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 663 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信