Скрипт Bash, который подает звуковой сигнал при высокой температуре во FreeBSD - PullRequest
0 голосов
/ 08 ноября 2018

Я работал над скриптом Bash, чтобы подать звуковой сигнал, когда компьютер слишком горячий.Я удалил звуковой сигнал, чтобы попытаться определить проблему.Что у меня пока есть:

temp=$(sysctl -n hw.acpi.thermal.tz0.temperature | tr -d 'C')
echo $temp

if ["$temp" -gt "30.1"]
then
   echo "temp hot"
else
   echo "temp ok"
fi

Мой вывод

54.1
temp.sh: line 4: [54.1: command not found
temp ok

Удаление оператора if просто выводит

54.1

, поэтому я думаю, что это if заявление, которое не работает.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Ваша непосредственная проблема - синтаксическая ошибка - вы пропустили пробел между командой ([ - /bin/[) и ее аргументами ($temp). Последний аргумент [ должен быть ] - в вашем скрипте тоже отсутствует пробел, что делает последний аргумент "30.1"]. Кстати, здесь нет необходимости в кавычках, и они только усложняют чтение.

Это общий запрос sh-scripting, он не имеет ничего общего ни с FreeBSD, ни с измерением температуры.

0 голосов
/ 08 ноября 2018

Вы должны использовать двойные круглые скобки (( )) для выполнения арифметических выражений, и, поскольку Bash не может обрабатывать десятичные значения, вам просто нужно удалить точку (как будто вы хотите умножить ее на десять).

temp=$(sysctl -n hw.acpi.thermal.tz0.temperature | tr -d 'C')
max_temp=50.2

(( ${temp//./} > ${max_temp//./} )) && echo "temp hot" || echo "temp ok"

Обязательно используйте один и тот же формат для обоих значений (особенно начальные нули, 54.10 станет 5410).

Если формат не может быть гарантирован, есть второй метод, как упомянуто Бенджамином W, с использованием bc. Вы можете послать этой команде логическую операцию с плавающей запятой, она возвращает 0, если истина, 1 в противном случае.

temp=$(sysctl -n hw.acpi.thermal.tz0.temperature | tr -d 'C')
max_temp=50.2

(( $(echo "$temp > $max_temp" | bc) )) && echo "temp hot" || echo "temp ok"
...