【问题标题】:integer expected error...blank line?整数预期错误...空白行?
【发布时间】:2016-04-11 14:56:57
【问题描述】:

执行以下操作时出现“整数表达式预期错误”:

NM=$(<file)
if test $NM -gt 0 
then
echo "workflow 1 would follow here"
else
if test $NM -lt 0
then
echo "workflow 2 would go after this"
else
echo "something else"
fi
fi

我从中获得 $NM 分配的文件仅包含一个数字(始终为整数)。该文件是 gmtmath 操作的输出。 我注意到,如果我打开该文件,它在包含数字的行下方有一个额外的行,如果我手动删除该空行,我的循环可以工作并且我没有收到错误。但是,我尝试以各种方式使用 sed 来自动删除空行,它会删除文件的全部内容,包括数字。有任何想法吗??

【问题讨论】:

  • 这有点奇怪。 echo -n "$NM" | hexdump -C的输出可以在读取后添加吗?
  • 我很好奇你在说什么循环。是否存在循环,或者您是否将条件语句称为循环?
  • 我终于能够重现并找出您的问题。答案如下,请记住在您的问题解决后选择一个答案。

标签: bash if-statement integer


【解决方案1】:

在阅读了一些 cmets 之后,我想知道您是否得到了一些无法打印的字符。我已经通过在 \n 之前添加一个 \r 来测试这一点,最终能够重现。这是您的代码的清理版本,使用 tr 删除一些多余的字符。

NM=$(tr -cd '[:graph:]' <file)

if [[ $NM -gt 0 ]]; then
   echo "workflow 1 would follow here"
elif [[ $NM -lt 0 ]]; then
   echo "workflow 2 would go after this"
else
   echo "something else"
fi

我本可以使用 [:graph:] 以外的其他类。我只是经常使用 [:graph:],但每个人都有自己的。

【讨论】:

  • $(&lt; file)$(cat file) 相同(并且比$(cat file) 更快),请参阅Bash manual
  • 我明白了——我的错误是我的测试文件中已经有一个 hexdump,所以我认为它的工作方式类似于 `exec 3>$file'
  • 已经解决了,谢谢!我必须承认,我是个新手,我从没想过使用 tr
【解决方案2】:

您想测试${#NM} 是否大于零(例如$NM 中的字符数)。目前,您正在针对 0 测试字符串的内容,而 bash 告诉您它需要一个数字。这同样适用于需要数字的每个测试。

如果要测试单词"$NM" 是大于0 还是小于0,请使用if ((NM &gt; 0)); then ...if ((NM &lt; 0)); then ...

您也可以使用较旧的test 表达式if [ "$NM" -gt 0 ]; then...if test "$NM" -gt 0 ; then...,但请注意,如果"$NM" 不能解释为数字,则会产生错误。 (您可以重定向stderr 来避免这种情况,但这在这里不明智)。

【讨论】:

  • 他也没有加载文件的内容,这是他稍后在帖子中引用的内容。
  • 是的,我看到了并添加了第二组测试。
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2017-07-30
  • 2013-05-18
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多