linux - 比较 bash 中的整数,需要一元运算符

下面的代码给出了

[: -ge: unary operator expected

i=0

if [ $i -ge 2 ]
then
    #some code
fi

为什么?

最佳答案

您的问题源于当您的语句失败时 $i 有一个空白值。 总是引用你的变量进行比较时,如果其中一个可能是空的,例如:

if [ "$i" -ge 2 ] ; then
  ...
fi

这是因为 shell 如何处理变量。假设原来的例子,

if [ $i -ge 2 ] ; then ...

shell 在执行特定代码行时所做的第一件事就是替换 $i 的值,就像您最喜欢的编辑器的 search & replace 功能一样。所以假设 $i 是空的,或者,更形象地说,假设 $i 是一堆空格! shell 将替换 $i 如下:

if [     -ge 2 ] ; then ...

现在变量替换已经完成,shell 继续比较并且......失败了,因为它看不到 -gtleft 可理解的任何内容。但是,引用 $i:

if [ "$i" -ge 2 ] ; then ...

变成:

if [ "    " -ge 2 ] ; then ...

shell 现在看到双引号,并且知道您实际上是在将四个空格与 2 进行比较,并将跳过 if

如果 $i 为空,您还可以选择为 $i 指定默认值,如下所示:

if [ "${i:-0}" -ge 2 ] ; then ...

这将用值 0 代替 $i$i 未定义。我仍然保留引号,因为同样,如果 $i 是一堆空白,那么它不会算作 undefined,它不会被 0 替换,你会再次遇到问题。

请阅读 this当你有时间的时候。许多人将 shell 视为一个黑盒子,但它使用非常少且非常简单的规则运行 - 一旦您知道这些规则是什么(其中之一是变量在 shell 中的工作方式,如上所述),shell 将没有更多的 secret 要告诉你。

https://stackoverflow.com/questions/408975/

相关文章:

Python Infinity - 有什么注意事项吗?

python - ValueError : The truth value of an array

django - 在 Django 中处理一页上的多个表单的正确方法

linux - 使用 Bash 自动将最后一个命令的输出捕获到变量中?

python - 自定义类型的对象作为字典键

linux - 如何提取 rpm 的内容?

linux - 使用 tar、gz、zip 或 bzip2 拆分文件

python - 编码/解码有什么区别?

linux - 如何强制从另一个 SSH session 中分离 screen ?

c - 编写程序以处理导致 Linux 上丢失写入的 I/O 错误