下面的代码给出了
[: -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 继续比较并且......失败了,因为它看不到 -gt
的 left 可理解的任何内容。但是,引用 $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/