Linux 比较bash中的整数,需要一元运算符
下面的代码给出了 [:-ge:应为一元运算符 什么时候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 ] ;
为什么?您的脚本工作得非常好。您确定在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如果错误,引用变量不会引发新的错误,就像如果变量是数值的,则预期的整数表达式一样;提供非数值变量值(无论是否引用)将导致上述错误。