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)
您可能知道或不知道,但让我们说清楚:[不是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解释集成,它改变了一些规则,它实际上是意识到之间的变量,报价[[和]]。如果您使用了[[而不是[(并因此]]使用了]),那么您的代码将按您的预期工作。看到这个答案。
[ 是便携式的。
| 归档时间: |
|
| 查看次数: |
340 次 |
| 最近记录: |