2013-09-09 4 views
0

Получение ошибки выше при запуске моего скрипта. Попытка проверить, не превышает ли значение вывода = «средний». Если нет, то распечатайте файл списка, если он начинается с начала цикла.BASH script,! =: Команда не найдена

#!/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 

ответ

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: вместо любой строки, не совсем нравится.

+0

Спасибо. Работает так, как я этого хотел. – user2733536

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.)