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

时间:2016-12-07 15:05:25

标签: linux bash shell

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

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

get_block_planner_solution(_Request) :
http_parameters(_Request, [ init(InitString,[optional(false),string]),
                            goal(GoalString,[optional(false),string])
                ]), 
atomic_list_concat(InitL, ;,InitString),
atomic_list_concat(GoalL, ;,GoalString),
process_atoms(InitL,TermListi),
process_atoms(GoalL,TermListg),
plan(TermListi,TermListg,P,F),
format('Content-type: text/html~n~n', []),
format('<html><div>~n', []),
format('<div>Start State: ~w </div>~n', [InitL]),
format('<div>Goal State: ~w </div>~n', [GoalL]),
format('<div>Plan: ~w </div>~n~n', [P]),
format('<div>TermListI: ~w</div>~n',[TermListi]),
format('<div>TermListG: ~w</div>~n',[TermListg]),
format('<table border=1>~n', []),
print_request(_Request),
format('~n</table>~n',[]),
format('</html>~n', []).

process_atoms([],[]).

process_atoms([H|T], [HT|RT]) :-
        atom_to_term(H,PT,Bindings),
        HT = PT,
        process_atoms(T, RT).

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

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

2 个答案:

答案 0 :(得分:12)

您可以使用:

set -u

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

  

-u

     

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

答案 1 :(得分:0)

set -u是更通用的选项,但正如其他答案的评论中所指出的那样,在编写带有set -u的惯用shell脚本时存在问题。另一种方法是创建参数扩展,在未设置特定变量时产生错误。

$ echo $foo

$ echo $?
0
$ echo "${foo?:no foo for yoo}"
bash: foo: :no foo for yoo
$ echo $?
1

此错误将导致非交互式shell退出。这为您提供了一种快速方法来保证错误条件不允许控制流继续使用未定义的值。 The spec不需要交互式shell退出,但值得注意的是,即使在交互式shell中,如果函数中发生此错误,bash也会从函数调用返回。