从 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 中只有字符串。
-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
比较数字。