Невозможно получить абсолютное значение вывода команды - PullRequest
0 голосов
/ 05 марта 2020

Поэтому я хотел сделать простой скрипт для проверки температуры процессора моего RasPi, который хранится в /sys/class/thermal/thermal_zone0/temp, и, следовательно, cat /sys/class/thermal/thermal_zone0/temp выдаст временную температуру, но вот так:

cat /sys/class/thermal/thermal_zone0/temp
38459

, что по сути означает 38,459 градуса Цельсия.

Мне не удалось отформатировать вывод, чтобы получить 38,594 ° C

Мой код:

tempT="$(cat /sys/class/thermal/thermal_zone0/temp)"
tempC=$($tempT / 1000)
echo "$tempC °C"

Ошибка I получить:

-bash: 38459: command not found
 °C

Спасибо

Ответы [ 3 ]

2 голосов
/ 05 марта 2020

Самое простое будет использовать awk.

awk '{print $1/1000}' /sys/class/thermal/thermal_zone0/temp

или с каким-либо другим управлением с помощью printf

awk '{printf "%.3f\n", $1/1000}' /sys/class/thermal/thermal_zone0/temp

Ошибка, которую вы видите, происходит из-за того, что вы использовали $( ...), который является подстановкой команды и пытается выполнить команду внутри. Поэтому, когда вы делаете:

$($tempT / 1000)

Сначала $tempT расширяется до 38459, а затем shell пытается запустить команду с именем 38459 с двумя аргументами / и 1000. Итак, вы видите сообщение 38459: Command not found. Используйте $((...)) для раскрытия арифметики c, но оболочки не реализуют арифметику с плавающей точкой c, поэтому вам придется использовать другие инструменты, такие как awk или bc.

2 голосов
/ 05 марта 2020

Я бы использовал b c, если он доступен в вашей системе.

$ CELSIUS=$(bc -l <<< $(cat /sys/class/thermal/thermal_zone0/temp)/1000)
$ echo $CELSIUS 
25.00000000000000000000
0 голосов
/ 05 марта 2020
TempC=$($tempT / 1000);

Разрешается до:

TempC=$(38459 / 1000);

И bash обрабатывает $(...) как команду для передачи в подоболочку, поэтому он пытается запустить исполняемый файл 38455, который он может не находит, а значит и жалуется.

Я бы использовал bc, как предложил @kinezan, хотя лично я предпочитаю следующее соглашение:

TempC=$(echo "scale=3; $tempT / 1000" | bc)

, которое выдает 38.459

...