if 命令中的测试条件

riz*_*wan 3 linux bash bash-scripting

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

输出it worked

#!/bin/bash

rizwan=''
if [ -n $rizwan ]; then
  echo "it worked"
fi
Run Code Online (Sandbox Code Playgroud)

替换-n-z, 并it worked在不期望输出时输出:

#!/bin/bash

rizwan=''
if [ -z $rizwan ]; then
  echo "it worked"
fi
Run Code Online (Sandbox Code Playgroud)

Kam*_*ski 8

您可能知道或不知道,但让我们说清楚:[不是if语法的一部分。我的意思是if [ …表现得像if true, if falseor if any_command, where [, true, falseand any_commandare commands. 它们返回退出状态,这对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 ]语法 where STRINGis -nor 或-z。此语法测试是否STRING为空。您的测试总是成功,因为既不是空字符串-n也不-z是空字符串。

要使代码片段作为[ -n STRING ]或工作[ -z STRING ],您需要双引号变量。扩展后[ -z "$rizwan" ],shell将正好传递三个参数给[。它们将是-z,变量的扩展值(即使它是一个空字符串)和]. 该工具将获得您希望它获得的所有参数。

如果$rizwan在您的示例中不加引号扩展为一个以上的单词,[则会得到三个以上的参数。一般来说,最终结果将取决于变量内容和[.

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

[[Bash 中的注释是不同的。这是一个关键字,它与shell解释集成,它改变了一些规则,它实际上是意识到之间的变量,报价[[]]。如果您使用了[[而不是[(并因此]]使用了]),那么您的代码将按您的预期工作。看到这个答案

[ 是便携式的。