BASH脚本,!=:找不到命令

时间:2013-09-09 14:12:41

标签: bash symbol-not-found

运行我的脚本时出现上述错误。试图检查输出值是否= =“average:”。如果没有,则打印到列表文件,如果是,则从循环开始。

#!/bin/bash

Oad=$(date +%Y_%m_%d.%H.%M.%S)

for i in {1..120}
do
OUTP= uptime | awk '{print $10}' | cut -f1 -d, 
echo $OUTP
if $OUTP != average:
   then $OUTP >> $Oad.lst
else continue;
fi
sleep 60
done
cat $Oad.lst | awk '{if(min==""){min=max=$1}; if($1>max) {max=$1}; if($1<min) {min=$1}; total+=$1; count+=1} END {print total/count, max, min}' > $Oad.out

2 个答案:

答案 0 :(得分:4)

这不是比较它的方法。

if $OUTP != average:

应该是

if [[ $OUTP != average: ]]

某些线条似乎也很奇怪

OUTP= uptime | awk '{print $10}' | cut -f1 -d,

我认为应该是

OUTP=$(uptime | awk '{print $10}' | cut -f1 -d,)

then $OUTP >> $Oad.lst

如果要将变量的值发送到文件,则应为

then echo "$OUTP" >> "$Oad.lst"

总的来说,我会建议这样的格式:

#!/bin/bash

Oad=$(date +%Y_%m_%d.%H.%M.%S)

for i in {1..120}; do
    OUTP=$(uptime | awk '{print $10}' | cut -f1 -d,)
    echo "$OUTP"
    if [[ $OUTP != average: ]]; then
        echo "$OUTP" >> "$Oad.lst"
        sleep 60
    fi
done

awk '{if(min==""){min=max=$1}; if($1>max) {max=$1}; if($1<min) {min=$1}; total+=$1; count+=1} END {print total/count, max, min}' "$Oad.lst" > "$Oad.out"

还有一点需要注意。为:

    if [[ $OUTP != average: ]]; then

你可能的意思是:

    if [[ $OUTP != *average:* ]]; then

匹配任何不包含average:的行,而不是任何不完全相同的行。

答案 1 :(得分:2)

这只是增加@konsolebox'答案的附加评论,但在单个Awk脚本中执行所有逻辑可能更好。

#!/bin/bash

Oad=$(date +%Y_%m_%d.%H.%M.%S)

for i in {1..120}
do
    uptime
    sleep 60
done |

awk '$10 != "average" { t=$10; sub(/,.*/,"",t);
         if(min=="") min=max=t;
         if(t>max) max=t;
         if(t<min) min=t;
         total += t; count++ }
    END {print total/count, max, min}' > $Oad.out

如果您还希望在$Oad.lst中使用中间结果,则需要进行一些重构,但这不是一个侵入性的更改。 (只需在主循环中打印,然后在END循环中打开第二个文件句柄。)