2014-01-08 1 views
0

bash 쉘 스크립트에서 간단한 계산을 시도 할 때 구문 오류가 발생합니다. 분명히 나는 ​​그것을 잘못하고 있지만 잘하면 누군가가 올바른 방향으로 나를 가리킬 수 있습니다. 구문 오류가 발생하지 않고 bash에서 간단한 산술 옵션을 수행하는 방법

diffSec=`expr $diff % 60`    # works fine 
diffMin=`expr $diff/60 % 60`   # works fine 
diffHr=`expr $diff/(60 * 60)`  # giving me problems due to the parens 
testerme=`expr $diff/3600`   # works fine but will use only as a work around 
diffDay=`expr $diff/(60 * 60 * 24)` # problems again 

는 구문 오류가 나는 얻을 수있다 :

./testscript.sh: command substitution: line 27: syntax error near unexpected token `(' 
./testscript.sh: command substitution: line 27: `expr $diff/(60 * 60)' 
./testscript.sh: command substitution: line 29: syntax error near unexpected token `(' 
./testscript.sh: command substitution: line 29: `expr $diff/(60 * 60 * 24)' 

어떻게 내가 구문 오류가 발생하지 않도록 괄호 안에 일을 실행합니까? 귀하의 도움에 미리 감사드립니다.

+1

'남자 expr' : _ ". 많은 사업자가 탈출 또는 껍질을 위해 인용 될 필요가 있음을주의"_ => 'EXPR의 $ diff/\ (60 \ * 60 \ * 24 \)' – Wrikken

답변

1

당신은 사용할 수 있습니다 $는 (())

모든
diffSec=$(($diff % 60))    # works fine 
diffMin=$(($diff/60 % 60))  # works fine 
diffHr=$(($diff/(60 * 60)))  # giving me problems due to the parens 
testerme=$(($diff/3600))   # works fine but will use only as a work around 
diffDay=$(($diff/(60 * 60 * 24))) # problems again 
1
diff=1234567 
diffSec=$(($diff % 60))   
diffMin=$(($diff/60 % 60))  
diffHr=$(($diff/(60 * 60))) 
testerme=$(($diff/3600)) 
diffDay=$(($diff/(60 * 60 * 24))) 
echo $diffDay days $diffHr hours $diffMin min $diffSec sec 

출력 : 쉘을 해석하지 않도록

14 days 342 hours 56 min 7 sec 
1

괄호 및 기타 기호는 이스케이프해야합니다. 또한 괄호 주위에 공백이 있어야합니다.

A=`expr 100000/\(60 \* 60 \)` 
+0

은 실제로 $() 구문을 사용해야합니다 – brianadams

1

첫째, 당신의 괄호 globs와의 일부인 것처럼 해석되고 있지만, 패턴 (종료하지 않는 것 그 사이에 공간이 있기 때문에). [1] 이것들은 탈출해야합니다. *도 glob로 사용되지 않도록 이스케이프해야합니다.

둘째, expr은 실제로 인수 중 하나의 부분 인으로 괄호를 허용하지 않습니다. 그들은 별도의 주장이 필요합니다.

같은, 당신은 아마 마찬가지로

diffHr=`expr $diff/\ (60 \* 60 \)` 

말했다

diffHr=`expr $diff/\ (60 \* 60 \* 24 \)` 

bash뿐만 아니라 $(()) 구조를 제공하고자, 그것은 아마를 사용하는 것이 더 좋습니다.

완전히 다른 솔루션으로
diffHr=$(($diff/(60*60))) 
diffDay=$(($diff/(60*60*24))) 
1

, 당신은 이제까지 명령 줄 프로그램 dc (책상 계산기를 의미)를 사용하는 방법에 대한 생각?

그것은 (또한 역 폴란드어로 알려진) 스택 기반 계산기

diffSec=`echo '$diff 60 %p' | dc` 
diffMin=`echo '$diff 60 60 /%p' | dc` 
diffHr=`echo '$diff 60 60 */p' | dc` 
diffDay=`echo '$diff 60 60 24 **/p' | dc` 
관련 문제