【问题标题】:Shell Scripts Integer Expression Expected需要 Shell 脚本整数表达式
【发布时间】:2018-04-08 21:59:51
【问题描述】:

我正在尝试在 bash 中运行以下脚本

#greetings
set `date`
if [ "$4" -lt 12 ]
then 
  echo "Good Morning"
elif [ "$4" -lt 18 ]
  echo "Good Afternoon"
else
  echo "Good evening"
fi
exit

我一直收到错误 ./greetings: line 3: [: 06:19:20: integer expression expected

我该怎么办?

【问题讨论】:

  • 应该只是 $4 而不是 "$4"
  • 我试过了还是不行
  • 当您运行脚本时,您传递的$4 是什么?因为-lt 需要标准数字。 IE。 12、13 或 12.5。如果超过 12:30,bash 将无法解析 :。所以它会抛出那个错误。
  • 你有解决办法吗?
  • elif 之后,您还缺少then

标签: linux ubuntu-16.04


【解决方案1】:

如果您尝试在脚本的最开头echo $4,您将获得以下格式的结果:

%H:%M:%S

例如,

$ date
16:41:22

这个结果不能被解析为整数。

一种解决方案是只设置小时而不是整个日期,并使用$1(而不是$4):

# greetings
set `date +%H`
if [ "$1" -lt 12 ]
then
  echo "Good Morning"
elif [ "$1" -lt 18 ]
then
  echo "Good Afternoon"
else
  echo "Good evening"
fi
exit

另外,请注意您在elif 之后缺少then 关键字。

【讨论】:

  • 命令集date将第四个参数设置为时间的值
  • @YousifShibeika 更新了答案。
【解决方案2】:
TIME=`date +%H:%M:%S | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'`

if [ "$TIME" -lt 43200 ]; then 
  echo "Good Morning"
elif [ "$TIME" -lt 64800 ]; then
  echo "Good Afternoon"
else
  echo "Good evening"
fi
exit

所有时间都转换为秒

【讨论】:

  • @Maroun 你说得对。但他的问题有H:m:s 格式,我不确定我可以用date 方法做到这一点。
猜你喜欢
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多