我正在研究 bash 中的 If 语句,并发现了一些意想不到的行为。
假设我有一个变量b=2
。这显然是一个字符串。如果我执行这样的 if 语句:
if [ $((b)) -lt 5 ]
then
...
fi
它成功地通过了条件语句,因为确实 2 小于 5。但是,如果我删除双括号 ( if [ b -lt 5 ]
),它的工作方式仍然与前面的示例相同。你能告诉我为什么会这样吗?我认为这-lt
仅适用于整数,不适用于字符串。它是否在这里将字符串变量隐式转换为整数类型?
我正在研究 bash 中的 If 语句,并发现了一些意想不到的行为。
假设我有一个变量b=2
。这显然是一个字符串。如果我执行这样的 if 语句:
if [ $((b)) -lt 5 ]
then
...
fi
它成功地通过了条件语句,因为确实 2 小于 5。但是,如果我删除双括号 ( if [ b -lt 5 ]
),它的工作方式仍然与前面的示例相同。你能告诉我为什么会这样吗?我认为这-lt
仅适用于整数,不适用于字符串。它是否在这里将字符串变量隐式转换为整数类型?
Bash 变量本质上是无类型的1 - 如果无法成功转换值,则仅对特定类型有意义的测试可能会在评估时失败。算术测试的有效形式是:
或(使用算术表达式语法)
如
ARITHMETIC EVALUATION
部分所述,在上下文中可以省略man bash
取消引用:$
(( ... ))
所以
在 POSIX 测试语法中情况并非如此,它将
[ ]
被b
视为字符串文字:如果您尝试对
[ ]
包含非数字值的变量执行算术测试,它将因同样的原因而失败,即该值无法转换为数字类型:1
declare -i
如果-u
shell 选项设置为 ex,则可以使用基本类型检查来实现。而分配一个有效的数值
成功。