知道为什么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 false
if any_command
[
true
false
any_command
if
即使[
它是内置命令(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
-z
STRING
-n
-z
要使代码片段像[ -n STRING ]
或一样工作[ -z STRING ]
,您需要用双引号括住变量。在扩展 之后[ -z "$rizwan" ]
,shell 将准确传递三的参数[
。它们将是-z
、变量的扩展值(即使它是一个空字符串)和]
。该工具将获取您希望它获取的所有参数。
如果$rizwan
示例中的 unquoted 扩展为多个单词,[
则会获得三个以上的参数。通常,最终结果将取决于变量内容和 的实现[
。
比较为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?。
Bash 中的注释[[
有所不同。它是一个关键字,它与 shell 解析器集成在一起,它改变了一些规则,它实际上知道 和 之间的变量和引号[[
。]]
如果你使用[[
而不是[
(因此而]]
不是]
),那么你的代码将按预期工作。参见这个答案。
[
是便携式的。
答案2
由于变量rizwan
为空,您的if
命令变为:
if [ -n ]
该语法[ STRING ]
测试字符串是否为空(无字符)。因此,对于[ -n ]
,字符串-n
显然不为空。