【问题标题】:Shell : Integer expression expected error [duplicate]Shell:整数表达式预期错误[重复]
【发布时间】:2016-06-01 14:21:40
【问题描述】:

我是 Unix 环境中编程的初学者,我在开始时遇到了一些困难。我在 Windows 上使用 PUTTY。 这是我的脚本和代码,但是当我运行它时,它告诉我

需要整数表达式

#!/bin/bash

hour='date|cut-c12-13'

if [ $hour -ge 0 -a $hour -lt 12 ]; then
      echo "good morn"
elif [ $hour -lt 18 ]; then
     echo "good afternoon"
else 
     echo "good night"
fi

它似乎与管道或其他东西无法正常工作;我认为它不会将“日期”翻译为原始日期,而是将其视为一个词。

【问题讨论】:

  • 另外,在当前版本的 POSIX 规范中,使用-a 作为“与”运算符已被明确标记为过时。如果您想与 POSIX 兼容,请改用 [ "$hour" -ge 0 ] && [ "$hour" -lt 12 ],或者使用 (( hour >= 0 && hour < 12 )) 来利用现代(更具可读性)特定于 bash 的语法。
  • ...请参阅pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html 了解 POSIX 测试的规范; -a-o 旁边的 OB 标志将它们标记为过时,XSI 标志将它们标记为基线 POSIX 标准的扩展(因此并非所有系统都需要从一开始就支持它们)。
  • (哦 -- 引用很重要;[ $hour -ge 0 ][ "$hour" -ge 0 ] 不是一回事:后者在许多常见情况下允许更好的错误消息,并防止在更罕见的集合中出现完全错误的结果条件。shellcheck.net 会为您发现各种错误)。
  • 当然你会想要hour=$(date +'%H)'而不是使用cut...而且你似乎不太可能得到一个负小时,所以小于零的测试也有点奇怪。

标签: shell unix syntax-error


【解决方案1】:

您的代码显示常规引号'…',而不是反引号`…`。使用

hour=$(date | cut -c12-13)

cut-c12-13 之间的间距很重要。一般来说,使用$(…) 比使用反引号更好(有关原因的讨论,请参见Pipe standard input and command line arguments in Bash)。另外,在这里学习How to debug a Bash script,意思是bash -x script.sh

使用编写的代码,$hour 中的值是字符串date|cut-c12-13(不是命令的输出),它不是整数表达式,因此是错误消息。此外,您很可能没有名为 cut-c12-13 的命令,这就是间距很重要的原因。


正如问题的 cmets 所示,还应解决多个其他问题,从直接从 date 命令生成所需信息到在变量引用周围使用双引号,而不是使用已弃用的运算符 -a-o[,有些人认为你应该使用[[ … ]] 而不是[ … ],或者Bash 特定的(( … )),等等。

【讨论】:

  • 可能值得解释一下$() 比反引号更好,因为它可以很容易地嵌套并且因为引用更容易处理。而且因为阅读您的代码的人不会无意中认为您输入了单引号。 :)
  • @dannysauer:我已在讨论该问题的问题中添加了外部参考。
  • 非常感谢,明白了。至于 bash -x script.sh 我做了 chmod +x 所以没关系
  • @Georgez:请注意,bash -x script.sh 可以让您跟踪脚本在运行时所做的事情;它相当于将set -x 作为脚本中的语句运行。它独立于脚本的权限。
猜你喜欢
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多