Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 比较bash中的整数,需要一元运算符_Linux_Bash_Shell - Fatal编程技术网

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

Linux 比较bash中的整数,需要一元运算符,linux,bash,shell,Linux,Bash,Shell,下面的代码给出了 [:-ge:应为一元运算符 什么时候 为什么?您的脚本工作得非常好。您确定在if之前没有为“i”分配任何其他内容吗 一个常见的错误是没有在方括号前后留下空格。从错误消息判断,i的值在执行它时是空字符串,而不是0。您的问题产生于这样一个事实,即当语句失败时,$i有一个空值。始终引用变量如果其中一个可能是空的,则进行比较,例如: if [ "$i" -ge 2 ] ; then ... fi 这是因为shell处理变量的方式。假设原始示例 if [ $i -ge 2 ] ;

下面的代码给出了

[:-ge:应为一元运算符

什么时候


为什么?

您的脚本工作得非常好。您确定在if之前没有为“i”分配任何其他内容吗


一个常见的错误是没有在方括号前后留下空格。

从错误消息判断,i的值在执行它时是空字符串,而不是0。

您的问题产生于这样一个事实,即当语句失败时,
$i
有一个空值。始终引用变量如果其中一个可能是空的,则进行比较,例如:

if [ "$i" -ge 2 ] ; then
  ...
fi
这是因为shell处理变量的方式。假设原始示例

if [ $i -ge 2 ] ; then ...
shell在执行该特定代码行时所做的第一件事是替换
$i
的值,就像您最喜欢的编辑器的搜索和替换函数一样。因此,假设
$i
为空,或者更具说明性的是,假设
$i
是一组空格!shell将替换
$i
e> 详情如下:

if [     -ge 2 ] ; then ...
if [ "${i:-0}" -ge 2 ] ; then ...
既然变量替换完成了,shell继续进行比较,…失败了,因为它看不到
-gt
左侧任何可理解的内容。但是,引用
$i

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

if [ "    " -ge 2 ] ; then ...
shell现在看到双引号,并且知道您实际上是在将四个空格与2进行比较,如果,将跳过

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

if [     -ge 2 ] ; then ...
if [ "${i:-0}" -ge 2 ] ; then ...
这将替换值0,而不是
$i
$i
未定义。我仍然保留引号,因为,同样,如果
$i
是一堆空白,则它不算作未定义,它不会被替换为0,并且您将再次遇到问题


当你有时间的时候,请阅读。许多人把shell当作一个黑匣子,但它的操作规则非常少且非常简单——一旦你知道这些规则是什么(其中之一就是变量在shell中的工作方式,如上所述)shell将不再为您提供任何机密。

我需要添加我的5美分。我看到每个人都使用
[
[[
,但值得一提的是,它们不是if语法的一部分

对于算术比较,请使用
(…)

(…)是一个算术命令,如果 表达式为非零,如果表达式为零,则为1。也可使用 作为“let”的同义词,如果需要副作用(任务)

见:


引用变量将产生一个新的错误,如整数表达式expected@N如果错误,引用变量不会引发新的错误,就像如果变量是数值的,则预期的整数表达式一样;提供非数值变量值(无论是否引用)将导致上述错误。