【问题标题】:Shell script: Simple compare in brackets not working the way I expect?Shell 脚本:括号中的简单比较不能按我预期的方式工作?
【发布时间】:2020-06-30 19:31:48
【问题描述】:

我正在尝试编写一个脚本来返回磁盘的大小(以字节为单位)。到目前为止,一切都很好。然后,我想尽可能以人类可读的单位显示它,而不是试图显示百万分之一 TB 的小尺寸,也不是以字节为单位的太字节值。因此,如果字节数高于 1024,请尝试 KB,如果该数字高于 1024,请尝试 MB,等等。出于说明目的,我的实际值为 10632563023872。

每个人都说尽可能使用双括号。我的大部分脚本都是用双括号写的。但在这种情况下,数学根本没有按照我期望的方式工作,所以也许有人可以帮助我理解我所缺少的。整个脚本还有很多内容,但我设法将我的问题隔离为一行:

num=10632563023872; 
if [[ $num -lt 1024 ]]; 
then echo "$num is less than 1024"; 
else echo "$num is greater than 1024"; 
fi

输出:

10632563023872 is less than 1024

虽然 shellcheck 说语法很好,但数学显然是(?)错误的,除非我遗漏了某种数据类型问题,但是在 bash 中没有声明变量和数据类型。如果我用括号尝试这个,我会得到正确的答案,尽管抛出了一个错误,我已经确认它只是返回 false,因为它不喜欢我的输入:

num=10632563023872; 
if (( $num -lt 1024 )); 
then echo "$num is less than 1024"; 
else echo "$num is greater than 1024"; 
fi
-sh: 10632563023872: not found
10632563023872 is greater than 1024

【问题讨论】:

标签: shell sh esxi


【解决方案1】:

问:为什么括号中的代码没有按我预期的方式工作?

答:因为事实证明 ESXi CLI 环境不是 bash,尽管我使用的语法通常是 bash 风格的。在提出这个问题时,我了解到它不是 bash,因此与 bash 的任何差异都只是这不是真正的 bash 环境的产物。

问:在我的情况下,哪种语法比[[ $num -lt 1024 ]] 能更好地完成任务?

答: [[ $num \> 1024 ]] 似乎工作可靠。也就是说,“如果在 [[ 行为类似于 [, [[ $num > 1024 ]] 的 shell 中进行字符串比较而不是数字比较。如果它解决了您的问题,这意味着 $num 实际上不是有效数字——可能是从文件或其他具有 DOS 换行符而不是 UNIX 换行符的源中读取的,只是为了随机排除潜在原因?”

我最初将问题标记为 bash,但当 ESXi 显然没有严格使用可识别的 bash shell 版本时,我将标记更改为 ESXi。对于未来的读者,我希望这有助于解释为什么某些代码在编写 ESXi 脚本时可能无法“按预期运行”。

感谢在 cmets 中提供指导的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多