셸 스크립트 내에서 수치 연산을 수행할 때 주로 사용되는 도구는
let, $(()), $[ ], 그리고 bc이며, 추가적으로 expr도 활용 가능하다. 이 중 let, $(()), $[ ]는 정수 기반의 기본 연산에 적합하고, bc는 실수(소수점) 연산이 가능하다.
- let, $(()), $[ ]
이 세 가지는 동일한 목적을 가진 구문으로, 대부분의 상황에서 서로 교체 가능하다.
먼저
let명령어를 살펴보자.[xf@xuexi ~]$ value=10 [xf@xuexi ~]$ echo $value 10 [xf@xuexi ~]$ let value=value+8; echo $value 18 [xf@xuexi ~]$ let value-=5; echo $value 13 [xf@xuexi ~]$ let value*=2; echo $value 26 [xf@xuexi ~]$ let value/=3; echo $value 8
다음은$(())표현식이다.[xf@xuexi ~]$ value=10 [xf@xuexi ~]$ value=$((value + 7)); echo $value 17 [xf@xuexi ~]$ value=$((value - 4)); echo $value 13 [xf@xuexi ~]$ value=$((value * 2)); echo $value 26 [xf@xuexi ~]$ value=$((value / 3)); echo $value 8
마지막으로 오래된 형태인$[ ]방식이다.[xf@xuexi ~]$ value=10 [xf@xuexi ~]$ value=$[value + 5]; echo $value 15 [xf@xuexi ~]$ value=$[value - 3]; echo $value 12
특히$(())와$[ ]는 명령어 내부에서 직접 사용 가능하지만,let은 그렇지 않다.[xf@xuexi ~]$ echo $((10 + 5)) 15 [xf@xuexi ~]$ echo $[10 + 5] 15
- bc: 실수 연산 처리
bc는 고정 소수점 계산이 가능한 계산기 프로그램이다. 명령행에서 실행 시:[xf@xuexi ~]$ bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. num = 10 num * 7 70 5 / 3 1 scale = 2 5 / 3 1.66 quit
스크립트 내에서 사용하려면echo를 통해 입력을 전달해야 한다. 예시 스크립트 파일 작성:[xf@xuexi ~]$ vim calc.sh [xf@xuexi ~]$ cat calc.sh #!/bin/bash input_num=15 echo "scale=3; $input_num / 4" | bc
실행 결과:[xf@xuexi ~]$ sh calc.sh 3.750
- expr: 기본 연산 및 문자열 처리
expr는 숫자 연산, 비교, 문자열 조작 모두 가능하다. 기본 산술 연산에서는 곱셈 연산자(*)가 특수 기호이므로 반드시 백슬래시(\*)로 이스케이프해야 하며, 숫자와 연산자 사이에는 공백이 필요하다.[xf@xuexi ~]$ expr 6 + 3 9 [xf@xuexi ~]$ expr 6 \* 4 24 [xf@xuexi ~]$ expr 10 / 3 3 [xf@xuexi ~]$ expr 6 + 3 9 [xf@xuexi ~]$ expr 6+3 6+3
비교 연산에서는 결과가 1(참), 0(거짓)으로 출력되며, 관계 연산자(<, > 등)는 반드시 이스케이프해야 한다.[xf@xuexi ~]$ expr 8 \> 5 1 [xf@xuexi ~]$ expr 3 \< 7 1 [xf@xuexi ~]$ expr 5 = 5 1 [xf@xuexi ~]$ expr 5 != 3 1
문자열 작업도 가능하다. - 길이 측정:length [문자열]- 부분 추출:substr [문자열] [시작위치] [길이](시작위치는 1부터 시작)[xf@xuexi ~]$ expr length "안녕하세요" 5 [xf@xuexi ~]$ expr substr "Hello World" 7 5 World