bash 比较运算符始终适用于字符串和数字比较

问题描述 投票:0回答:1

从 CentOS 7 迁移到 Almalinux 9 我编写了一个最简单的 Bash 脚本来控制 inotifywait 进程的数量(必须是 11) - 但我对结果感到非常惊讶,具体取决于所使用的比较运算符。

(BASH - GNU bash,版本 5.1.8(1)-release (x86_64-redhat-linux-gnu))

#!/bin/bash
itf=$(ps aux | grep [i]notify | wc -l); 
status=$(mysql -uroot -N -e 'SELECT status FROM db.table WHERE filename LIKE "rates.xml"');
echo "$itf";  # correct value - 11
echo "$status";  # correct value - OK
printf "First compare numeric\n"
if [[ "itf" -eq 11 ]] ; then 
echo "OK - all 11 inotifywait processes run";
else
printf  "Just $itf inotifywait processes running of 11\n";
fi
printf "Second compare string just experiment\n"
if [[ "$status" != "OK" ]]; then
echo STATUS BAD ;
else
echo STATUS GOOD ;
fi
exit ;
    sh

我在上面的编码中没有看到任何错误 - 但计数结果是错误的。尽管 bash 计数了 11 个进程(应该是这样),但它显示了负面结果

Just 11 inotifywait processes running of 11

但是当我将比较运算符从

更改为
if [[ "itf" = 11 ]] ; then 

if [[ "itf" -eq 11 ]] ; then 

然后我就得到了应有的积极结果

OK - all 11 inotifywait processes run

同时,在比较字符串时似乎使用什么运算符都无关紧要。我都测试过

if [[ "$status" != "OK" ]]; then
if [[ "$status" -ne "OK" ]]; then

这两种情况我们都有正确的结果

STATUS GOOD

无论运行脚本为SH还是BASH。

我的问题是 - 我们是否应该始终在 bash 中使用“文本”比较运算符,例如“-ne”、“-eq”等 - 因为它们对于所有类型的比较(字符串或数字或其他任何类型)都是通用的? 提前感谢您的意见,

bash compare operators
1个回答
0
投票

在 Bash 中只有字符串。

-ne
-eq
比较数字,或者在
[[
的上下文中,算术表达式。

在算术表达式中,不是变量的字符串被替换为

0

$ if [[ "OK" -eq 0 ]]; then echo true; fi
true
$ if [[ "literally_anything" -eq 0 ]]; then echo true; fi
true
$ if [[ "literally_anything" -eq "something_completely_else" ]]; then echo true; fi
true
$ literally_anything=1
$ something_completely_else=2
$ if [[ "literally_anything" -eq "something_completely_else" ]]; then echo true; else echo false; fi
false
 if [[ "itf" -eq 11 ]] ; then 

itf
是一个变量。
-eq
评估
itf
并扩展它。

您打算编写

if [[ "$itf" = 11 ]] ; then
来比较代码中的字符串。

它可能对

if ((itf == 11))
来说更具可读性。

 if [[ "$status" -ne "OK" ]]; then

$status
扩展为某些文本。该文本恰好不是变量。所以就变成了
0
OK
也不是变量,所以它变成了
0

什么 bash 比较运算符始终适用于字符串和数字比较

没有。

=
比较字符串。
-ne
-eq
比较数字。

© www.soinside.com 2019 - 2024. All rights reserved.