bash脚本新手。在bash脚本的开头,变量被初始化
silent_install=true
然后在脚本
中以下列两种方式使用此变量if [ -z "$silent_install" ]; then
和
if [ -z ${silent_install} ]; then
2次使用有什么区别?
答案 0 :(得分:7)
简短:第二个是错误的。
错误,因为未加引号的变量将成为单词拆分的主题。如果变量包含空格,则测试将失败。
{}
没有区别,你可以使用或不使用它们,有或没有引号。但是,一般来说我会建议使用它们。特别是如果你像"$foo_bar"
那样插值它们。这里的变量名称是什么? "${foo}_bar"
更清洁。
我会因此使用:
if [ -z "${silent_install}" ] ; then
答案 1 :(得分:2)
你应该使用双引号,使其成为一个字符串。使用值true
,您将看到没有区别,但是当silent_install具有特殊字符或空格(silent_install="I do not know"
)时,您将遇到麻烦。
开始习惯{}
。它们在这里并不重要,但是当你在它后面有其他字符时会很重要($SILENT_INSTALLandmore
)
大写字符是为bash保留的,因此请使用if [ -z "${silent_install}" ]
答案 2 :(得分:2)
除了分词的问题,其他答案指出,[ -z ${silent_install} ]
还有另一个问题。在其中一个预期情况下,silent_install
未设置或为空,测试命令将扩展为[ -z ]
。当[
命令获得只包含一个参数的表达式时,它会测试该参数以查看它是否为非空白。在这种情况下," -z"是非空的,因此测试返回true。这是预期的结果,但这只是巧合;它实际上正在测试与脚本作者所假设的非常不同的东西。
此脚本问题的更严重的变体是反向测试,[ -n ${somevar} ]
(-n
表示"不是空白",与-z
相反。因为[ -n ]
实际上测试-n
是否为非空白,所以它返回true,这与您期望的相反。
故事的寓意是"双引用你的变量引用!"它可以防止各种奇怪的错误和意外行为。