Tag Archives: shell

[Linux/Floating Point] Shell Script로 부동소수점 연산하기

리눅스 쉘스크립트 프로그래밍은 간단하면서도 매우 강력한 능력을 발휘하는 언어(?)입니다. 여기서 부동소수점 연산을 시도해 볼려고 하면 다음과 같은 문제들이 있습니다.

[code]> i=1+2
> echo $i
1+2[/code]
생각했던데로 나오지 않는군요. 하지만 쉘에서 사용할 수 있는 expr이라는 명령이 있습니다.

[code]> i=`expr 1 + 2`
> echo $i
3[/code]
여기서 expr을 사용할때 숫자와 연산자 사이에 공백이 들어간다는것을 유의합시다. 연산이 정상적으로 이루어짐을 알 수 있습니다.

[code]> i=`expr 1.2 + 2.5`
expr: non-numeric argument[/code]
하지만 부동소수점 연산이 안되는군요. 큰일입니다. 어떻게 방법이 없을까요.

[code]> i=`echo “1.2 + 2.5″|bc`
> echo $i
3.7[/code]
bc를 이용해서 해결해보았습니다.

[code]> i=`echo “1.22 2.51″|awk ‘{printf “%.2f”, $1 + $2}’`
> echo $i
3.73[/code]
이번엔 자체적으로 부동소수점 연산을 지원하는 awk를 이용하여 해결해 보았습니다. 출력포맷의 %.2f를 사용하여 소수점 이하 2번째 자리까지 사용하여 반올림 하도록 하였습니다.

[쉘스크립트] 쉘스크립트로 다수의 작업을 병렬처리 하기

사용자 삽입 이미지

간단하게 두세가지 작업을 수행해야 하는데 이 작업들이 모두 끝나는 시점에 수행해야 하는 작업이 있습니다. 보통 두세가지 작업을 동시에 하려면 &(Ampersand)를 붙여 백그라운드 작업으로 돌리면 해결될 문제입니다. 하지만 모두 끝나는 시점에 무언가를 해야 한다면 조금 생각해볼 문제가 되겠죠.

생각을 해보면 작업을 수행할때마다 PID값을 알아내어 이 PID가 끝나길 기다렸다가 끝나는대로 다음 작업을 수행하면 될 것 같습니다. 이런 경우를 위해 wait라는 명령이 bash쉘에 Builtin되어있습니다. 간단하게 다음의 예제를 확인해 보겠습니다.

#!/bin/sh

echo "예제를 시작합니다"

sleep 10 &
sleep 15 &

echo "모든 명령이 병렬로 실행되었습니다"

WORK_PID=`jobs -l | awk '{print $2}'`
wait $WORK_PID

echo "모든 명령이 종료되었습니다"

이 예제를 실행해 보면 다음과 같은 결과를 보여줍니다.

예제를 시작합니다
모든 명령이 병렬로 실행되었습니다
모든 명령이 종료되었습니다

jobs명령의 경우 -l옵션을 붙여주게 되면 PID값도 함께 출력되게 됩니다. 이것을 이용하면 굳이 매번 프로세스를 실행할때마다 PID를 저장하려는 노력을 하지 않아도 됩니다.

[eye@theeye ~]# sleep 500 &
[1] 4962
[eye@theeye ~]# jobs
[1]+  Running                 sleep 500 &
[eye@theeye ~]# jobs -l
[1]+  4962 Running                 sleep 500 &

이런 명령을 활용하여 복잡한 여러 스크립트들의 수행속도를 꽤 많이 단축시킬 수 있었습니다.