如何将bash视为未定义的变量作为错误?

Rob*_*ick 11 linux bash shell

请注意:关于如何在此站点上测试单个shell变量有很多问题.这个问题是关于测试任何未定义变量的脚本.

您可以在bash中使用未定义的变量,而不会在执行时看到任何错误:

#!/bin/bash

echo ${UNDEF_FILE}
ls -l ${UNDEF_FILE}

exit 0
Run Code Online (Sandbox Code Playgroud)

我发现这很容易出错.如果我想在大脚本中更改变量的名称,或者删除该变量,则所有先前过时的引用都将导致脚本中的错误.有时这对于调试来说并不明显,或者你发现它为时已晚.

为什么允许这样做?有没有办法标记未定义的变量?

anu*_*ava 15

您可以使用:

set -u
Run Code Online (Sandbox Code Playgroud)

在脚本开始时使用未定义的变量时抛出错误.

-u

执行参数扩展时,将特殊参数"@"和"*"以外的未设置变量和参数视为错误.如果尝试对未设置的变量或参数进行扩展,则shell会输出错误消息,如果不是交互式,则会以非零状态退出.

  • ...但是,值得注意的是,这个实用程序是有争议的:许多常见的习惯用法依赖于未定义的值扩展为空字符串,因此如果需要,代码需要为`set -u`兼容性明确编写它就是这样. (4认同)
  • `set -o nounset`与`set -u`(在Bash中)具有相同的效果,有些人更喜欢它. (2认同)
  • 请参阅[使用“set -o nounset”时测试 bash 中是否设置了变量](http://stackoverflow.com/q/7832080/4154375) 了解处理使用 `set -u` 或 ` 引起的常见问题的方法set -o 名词集`。 (2认同)