Сценарий оболочки - [: -lt: ожидается унарный оператор

#!/bin/bash
#ps -aux | grep abcd > /home/test1.txt
var= grep -o -i abcd /home/test1.txt | wc -l
threshold=15
if [ $var -lt $threshold ]; then
echo "One of the service is down on $HOSTNAME" >mail.txt
mailx -s "Application alert on $HOSTNAME" [email protected] <mail.txt
fi
if [ $var -eq $threshold ]; then
echo "All services are up and running fine on $HOSTNAME" >mail.txt
mailx -s "Application alert on $HOSTNAME" [email protected] <mail.txt
fi
exit;

Я получаю [: -lt: ожидается унарный оператор и [: -eq: ожидается унарный оператор, когда инициируются циклы if. Может ли кто-нибудь помочь, почему это происходит?


person rb16    schedule 15.05.2018    source источник
comment
Пробел после var= означает, что $var никогда не присваивается значение, поэтому [ $var -lt $threshold ] становится [ -lt 15 ]. shellcheck.net — ваш друг. И похоже, что вам не хватает некоторых $(…).   -  person Biffen    schedule 15.05.2018
comment
Возможный дубликат ожидается унарный оператор   -  person Biffen    schedule 15.05.2018
comment
1 Строка var= должна быть var=$(grep -o -i abcd /home/test1.txt | wc -l). (Никаких пробелов вокруг =!) 2 [ $var -lt $threshold ] должно быть [ "$var" -lt "$threshold" ]. 3 Нет необходимости во временном файле: echo "One of the service is down on $HOSTNAME" | mailx -s "Application alert on $HOSTNAME" [email protected] 4 Нет необходимости в ; после exit. 5 Нет необходимости в exit.   -  person Biffen    schedule 15.05.2018
comment
Здесь очень придирчиво, но пробел после var= не означает, что var никогда не присваивается значение. В качестве значения ему присваивается пустая строка, но это значение сохраняется только в среде команды grep.   -  person William Pursell    schedule 15.05.2018
comment
Используется ли mail.txt позже? Если нет, то лучше использовать heredoc.   -  person William Pursell    schedule 15.05.2018
comment
Большое спасибо. Я сделал эти изменения, и это сработало как шарм. Я обязательно постараюсь сделать больше. О, и mail.txt, я просто использую его как ссылку, чтобы увидеть, выбрал ли скрипт желаемый результат. Тип файла журнала. Спасибо вам всем. Теперь проблема решена.   -  person rb16    schedule 17.05.2018


Ответы (1)


Сделайте отступ блоков кода внутри оператора if:

#!/bin/bash
var= grep -o -i abcd /home/test1.txt | wc -l
threshold=15
if [ "$var" -lt "$threshold" ]; then
    echo "One of the service is down on $HOSTNAME" >mail.txt
    mailx -s "Application alert on $HOSTNAME" [email protected] <mail.txt
fi
if [ "$var" -eq "$threshold" ]; then
    echo "All services are up and running fine on $HOSTNAME" >mail.txt
    mailx -s "Application alert on $HOSTNAME" [email protected] <mail.txt
fi
exit;

(или удалить эхо)

person 4ndy    schedule 15.05.2018
comment
Отступы в коде ничего не решат (кроме удобочитаемости). У вас все еще есть ошибка в коде, которая привела к проблеме. Переменной var никогда не присваивается значение. Это назначение вверху, вероятно, должно быть заменой команды. Вам также необходимо заключать в двойные кавычки все расширения переменных и подстановки команд, иначе у вас возникнут проблемы с пробелами, переводами строк и т. д. - person Kusalananda; 15.05.2018
comment
Спасибо за быстрый ответ. Я новичок в написании сценариев, и я не уверен, как здесь выполнить подстановку команд. Я добавил двойные кавычки, и теперь я получаю [:: ожидаемое целочисленное выражение - person rb16; 15.05.2018