shell脚本中的数字非法

时间:2014-08-01 21:21:05

标签: bash shell

我是编写脚本的新手,我试图从一个简单的开始。我很难过收到错误的原因:[: 13: Illegal number: count来自下面的代码。第13行是最后一个fi

count=grep "^$(date -d -30minute +'%Y-%m-%d %H:%M')" /var/log/****/zlsapp.log | wc -l
if [ count -ge 50 ]
then
    if [ count -lt 100 ]
    then
        exit 1
    fi  
    if [ count -ge 100 ]
    then 
        exit 2
    fi
    exit 0
fi

无论如何还要复制if if(count >= 50 && count < 100)等语句?

3 个答案:

答案 0 :(得分:4)

有两个原因。 bash变量中的(1)是无类型的(可以是int,可以是char)。为了消除歧义,您可以使用以下命令指定类型:

declare -i count

告诉bash它应该是一个int。 (2)您需要使用$取消引用您的变量才能获得回数。 I.E.

[ $count -lt 100 ]

(引用变量也是一种好习惯 - 不是必需的,但是很好的做法:[ "$count" -lt 100 ]。如果仍有问题,请发表评论。

答案 1 :(得分:2)

该行:

count=grep "^$(date -d -30minute +'%Y-%m-%d %H:%M')" /var/log/zumigo/zlsapp.log | wc -l

可能不会按照您的想法执行(或者您没有准确地将实际代码复制并粘贴到问题中)。如果在2014-08-01中间运行,则运行命令&#34; 2014-08-01 12:00&#34;将日志文件作为参数,将环境变量count设置为值grep,并将可能不存在的命令的输出传递给wc -l

当您随后在测试语句中测试$count时,它是一个空字符串,无法正确转换为数字。

你可能意味着:

count=$(grep "^$(date -d -30minute +'%Y-%m-%d %H:%M')" /var/log/zumigo/zlsapp.log | wc -l)

这会捕获日志文件上运行grep的输出并将输出汇总到wc -l

如果您使用bash -x或等效的脚本运行脚本(-x选项通常会显示脚本的执行情况),您应该看到这一点。

答案 2 :(得分:1)

问题是count没有引用变量count;它只是字符串"count"

变化:

if [ count -ge 50 ]

if [ $count -ge 50 ]

并在其他位置进行相应的更改(但不在初始分配中)。

您还应该使用双引号:

if [ "$count" -ge 50 ]
  

无论如何还要复制if if(count&gt; = 50&amp;&amp; count&lt; 100)这样的陈述?

是:

<击>

<击>
if [ "$count" -ge 50 -a "$count" -lt 100 ]

<击>

可能有效,但-a(逻辑和)运算符为marked as obsolescent by POSIX。而是写

if [ "$count" -ge 50 ] && [ "$count" -lt 100 ]

如果您正在使用bash,info bash并搜索&#34;测试&#34;命令([test)的别名。

如果您正在使用bash,则应考虑使用[[ ... ]]而非[ ... ] - 或者您可以使用(( ... ))作为算术表达式。有关详细信息,请参阅bash documentation(关注iink或输入info bash)。

除了缺少$标志之外,还有脚本的第一行:

count=grep "^$(date -d -30minute +'%Y-%m-%d %H:%M')" /var/log/****/zlsapp.log | wc -l

没有设置count变量,因为您没有捕获grep ... | wc -l命令的输出。为此:

count=$(grep "^$(date -d -30minute +'%Y-%m-%d %H:%M')" /var/log/****/zlsapp.log | wc -l)

(是的,$(...)可以嵌套。)