在 if 命令中测试条件

在 if 命令中测试条件

知道为什么echo在两种情况下都会执行语句吗?

输出it worked

#!/bin/bash

rizwan=''
if [ -n $rizwan ]; then
  echo "it worked"
fi

替换-n为,当预期没有输出时-z它会输出:it worked

#!/bin/bash

rizwan=''
if [ -z $rizwan ]; then
  echo "it worked"
fi

答案1

你可能知道也可能不知道,但让我们明确一点:[不是语法的一部分if。我的意思if [ …是 的行为类似于if true或,其中、和是命令。它们返回退出状态,这对 来说很重要。if falseif any_command[truefalseany_commandif

即使[它是内置命令(Bash 中确实如此),它的行为也像常规命令一样。甚至还有一个独立的[可执行文件(例如/usr/bin/[),因为它是 POSIX 所要求的。

这意味着[ -n whatever ]它只是一个[带有几个参数的命令。是的,]它只是一个参数,而不是分隔符或类似的东西。命令名称[只需要]作为它的最后一个参数。这样,​​代码就更清晰了,]没有其他用途。

该命令test相当于[。唯一的区别是test不需要]
[ -n whatever ]相当于test -n whatever

如果 shell 扩展$rizwan为空字符串,则代码片段[ -n $rizwan ]和分别[ -z $rizwan ]变为[ -n ]和。该命令不知道代码中(或) 和之间有什么内容,它只获得两个参数。这两个测试都被视为语法,其中 是或。此语法测试是否不为空。您的测试总是成功,因为 和 都不是空字符串。[ -z ][-n-z][ STRING ]STRING-n-zSTRING-n-z

要使代码片段像[ -n STRING ]或一样工作[ -z STRING ],您需要用双引号括住变量。在扩展 之后[ -z "$rizwan" ],shell 将准确传递的参数[。它们将是-z、变量的扩展值(即使它是一个空字符串)和]。该工具将获取您希望它获取的所有参数。

如果$rizwan示例中的 unquoted 扩展为多个单词,[则会获得三个以上的参数。通常,最终结果将取决于变量内容和 的实现[

比较为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?

Bash 中的注释[[有所不同。它是一个关键字,它与 shell 解析器集成在一起,它改变了一些规则,它实际上知道 和 之间的变量和引号[[]]如果你使用[[而不是[(因此而]]不是]),那么你的代码将按预期工作。参见这个答案

[是便携式的。

答案2

由于变量rizwan为空,您的if命令变为:

if [ -n  ]

该语法[ STRING ]测试字符串是否为空(无字符)。因此,对于[ -n ],字符串-n显然不为空。

相关内容