셸 스크립트에서 사용하는 수치 계산 방법

셸 스크립트 내에서 수치 연산을 수행할 때 주로 사용되는 도구는 let, $(()), $[ ], 그리고 bc이며, 추가적으로 expr도 활용 가능하다. 이 중 let, $(()), $[ ]는 정수 기반의 기본 연산에 적합하고, bc는 실수(소수점) 연산이 가능하다.
  1. 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
    
  2. 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
    
  3. 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
    

태그: bash Shell scripting arithmetic operations bc expr

7월 18일 19:49에 게시됨