Bash 단순 스크립트가 제대로 작동하지 않습니다.

Bash 단순 스크립트가 제대로 작동하지 않습니다.

저는 이 bash 코드를 사용하여 Raspberry Pi의 온도를 가져오고 화씨와 섭씨로 변환하여 표시한 다음 텍스트 파일에 저장하려고 합니다.

#!/bin/bash
echo ""
cpu="$(/opt/vc/bin/vcgencmd measure_temp)"
far=$((cpu/1000))
far2=$((far*9))
far3=$((far2/5))
far4=$((far3+32))
echo "CPU => $((cpu/1000))' C or $((far4))' F"
echo ""
echo "Pi temp $far4 degrees F" > /var/www/html/pitemp.txt

그런데 실행해 보면 화씨는 괜찮은데 섭씨는 왜 안 나오나요?

pi@raspberrypi:~ $ nano checkTemp.sh
pi@raspberrypi:~ $ ./checkTemp.sh

./checkTemp.sh: line 3: temp=40.0'C: command not found
CPU => 0' C or 32' F

pi@raspberrypi:~ $ /opt/vc/bin/vcgencmd measure_temp
temp=40.0'C

CPU와 Far 값을 확인해 봤는데 안되는 것 같습니다. 어떤 제안이 있으십니까? [해결됨]


#!/usr/bin/env bash
echo ""
cpu="$(/opt/vc/bin/vcgencmd measure_temp | sed -E 's/.*=([0-9.]*).*/\1/')"
## convert to Fahrenheit
far=$( echo "$cpu * 9/5 + 32" | bc -l)
## Remove extra decimal digits
printf "CPU => %.2f' C or %.2f' F\n" "$cpu" "$far"
echo ""
printf "Pi temp %.2f degrees F\n" "$cpu" > /var/www/html/pitemp.txt
echo "C:$cpu F:$far"

이 새 코드는 작동하지만 출력은 다음과 같으므로 화씨 온도에 문제가 있는 것 같습니다.

pi@raspberrypi:~ $ nano checkTemp.sh
pi@raspberrypi:~ $ ./checkTemp.sh

./checkTemp.sh: line 5: bc: command not found
CPU => 43.00' C or 0.00' F

C:43.0 F:
pi@raspberrypi:~ $ /opt/vc/bin/vcgencmd measure_temp
temp=43.0'C
pi@raspberrypi:~ $

답변1

귀하의 $cpu변수는 temp=40.0'C. 숫자가 아니고, 나누거나 곱할 수 없으므로 먼저 실제 수치를 추출해야 합니다. 그러니 나가야 합니다 40.0. 다음과 같은 방법으로 이 작업을 수행할 수 있습니다.

cpu="$(/opt/vc/bin/vcgencmd measure_temp | sed -E 's/.*=([0-9.]*).*/\1/')"

다음 문제는 bash가 부동 소수점 연산을 수행할 수 없다는 것입니다. 따라서 정수가 아닌 값을 처리할 수 없습니다. 다음과 같은 또 다른 도구가 필요합니다 bc.

far=$(echo "$cpu/1000" | bc -l)

물론 CPU 온도는 섭씨 1000도 이상(또는 거의 가까움)이 절대 아니기 때문에 이 구분은 정확할 수 없습니다. 섭씨를 화씨로 변환하는 공식은 다음과 같습니다.

T(°F) = T(°C) × 9/5 + 32 

이 작업은 한 단계로 수행할 수 있습니다. 이 모든 것을 종합하면 다음과 같은 스크립트 버전이 작동해야 합니다.

#!/usr/bin/env bash
echo ""
cpu="$(/opt/vc/bin/vcgencmd measure_temp | sed -E 's/.*=([0-9.]*).*/\1/')"
## convert to Fahrenheit
far=$( echo "$cpu * 9/5 + 32" | bc -l)
## Remove extra decimal digits
printf "CPU => %.2f °C or %.2f °F\n" "$cpu" "$far"
echo ""
printf "Pi temp %.2f degrees F\n" "$far" > /var/www/html/pitemp.txt

없는 경우 bc다음을 사용할 수 있습니다.

#!/usr/bin/env bash
echo ""
cpu="$(/opt/vc/bin/vcgencmd measure_temp | sed -E 's/.*=([0-9.]*).*/\1/')"
## convert to Fahrenheit
far=$( perl -le 'print $ARGV[0] * 9/5 + 32' "$cpu")
## Remove extra decimal digits
printf "CPU => %.2f °C or %.2f °F\n" "$cpu" "$far"
echo ""
printf "Pi temp %.2f degrees F\n" "$far" > /var/www/html/pitemp.txt

관련 정보