2017-09-04 1 views
0

누군가 내 삼바 서버에서 데이터를 스트리밍하는지 (즉 음악이 재생 중인지 아닌지)를 인식하는 스크립트를 작성하고 싶습니다. 이를 위해,이 같은 스크립트를 마련했습니다bash에서 변수를 표준 출력으로 인쇄하지 않고

$ cat /home/ron/scripts/keepup.sh 
#!/bin/bash 

exec=`nethogs -t -c 1| awk '/smbd/ {print $2}'` 

sent=$exec 

echo "result: "$sent 
sent="($sent+0.5)/1" | bc 
echo "rounded: "$sent 
if [[ $sent -gt 0 ]] 
then 
    echo "music is playing" 
else 
    echo "quiet" 
fi 

하지만 난 얻을 :

Waiting for first packet to arrive (see sourceforge.net bug 1019381) 
result: 6.73438 
rounded: 6.73438 
/home/ron/scripts/keepup.sh: line 10: [[: 6.73438: syntax error: invalid arithmetic operator (error token is ".73438") 
quiet 

는 분명 결과는 true "6.73438"를 계산해야하지만. 내 반올림이 제대로 작동하지 않는 것 같습니다. 내가 주위에 봤 거든하지만 에코 또는 printf를 사용하여 답변을 찾았지만 그것은 둥근 결과를 IF 조건으로 먹이로 원하는대로 npt이야.

답변

4

이것은 잘못된 것입니다 :

sent="($sent+0.5)/1" | bc 

당신이 필요합니다

sent=$(bc <<< "($sent+0.5)/1") 

또는 :

sent=$(echo "($sent+0.5)/1" | bc) 
1

bc는 반올림을하지 않습니다. 이러한 테스트를 고려

$ a="17.928671"; a=$(bc -l <<<"scale=3; $a/1");echo "$a" 
17.928 

$ a="17.928671"; a=$(printf '%.3f\n' "$a");echo "$a" 
17.929 

는 약 bcscale 옵션은 소수 자릿수 (스케일 = 3)을 조정하는 데 사용할 수있는 것을 생각하지만, 위해이 scale=3bc이 부문을받을 것으로 기대하고 활성화 할 수 있습니다.

결과적으로 반올림이 필요하면 printf

을 사용하는 것이 좋습니다.
관련 문제