bash_01 셸 변수를 정수값 같은 속성으로 선언하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: declare, curl
키워드: bash, 변수, 속성, 자료형, 산술 확장
사용처: 셸 변수를 정수값으로 선언해서 자동으로 계산하고 싶을 때


실행예제

$ ./bash-declare.sh
	      URL을 자동 생성해서 내려받기

스크립트

#!/bin/bash

url_template="http://www.example.org/download/img_%03d.jpg"

# 카운터 변수  count를 정수형으로 선언
declare -i count=0  #-------------------------------------- 1

while [ $count -le 10 ]
do
  url=$(printf "$url_template" $count)
  curl -O "$url"

  # count를 1 늘림. expr 명령어 없이 계산식만으로 가능
  count=count+1 #------------------------------------------ 2
done

   

해설

이 스크립트는 연속 파일명을 생성해서 웹 페이지에서 순서대로 내려받습니다.

제어 구문 예제2 가 bash 정수값 변수를 다루도록 수정한 것입니다.

bash는 셸 변수에 속성값 등을 설정하고, 참조하는 declare 명령어를 사용할 수 있습니다. declare 명령어는 크게 나눠서 두 가지 사용법이 있습니다.

  1. 변수 속성을 설정하기
  2. 현재 정의한 변수, 함수명을 표시하기

이런 두 가지 사용법을 각각 설명합니다.

우선 변수 속성을 설정하는 방법입니다. 예를 들어 다음은 정수값 셸 변수인 count를 선업합니다.

declare -i count=0

셸 스크립트는 기본적으로 변수에 자료형이 없이 모두 문자열로 다룹니다. 하지만 delcare문을 이용하면 셸 변수에 정수인지 배열인지 같은 속성을 지정할 수 있습니다. 다른 프로그래밍 언어에서 일반적으로 사용하는 변수 선언과 비슷한 개념이므로 이해하기 쉬울 것입니다.

다음은 현재 정의한 변수와 함수명을 표시하는 방법입니다. 다음 실행 예는 현재 스크립트에서 정의한 변수 count값을 표시합니다.

  • 셸 변수 count 참조

    $ declare -i count=2
    $ declare -p count
    declare -i count="2"
    

스크립트 중간에 변수 상태를 확인하고 싶거나 디버그 용도로 자주 사용하는 기능입니다. 특히 변수명이 길 때 매번 echo 명령어로 echo “something_counter” 같이 변수 확인을 위한 문장을 추가하셔 같이 변수 확인을 위한 문장을 추가하지 않아도 되어 편리합니다.

declare 명령어에서 자주 사용하는 옵션을 속성 설정과 참조로 나눠서 표로 정리해봤습니다. 그리고 bash 4.0 이상에서는 변수를 대문자 문자열 전용으로 다루는 declare -u 같은 재미있는 옵션도 추가되었습니다. 자세한 것은 bash 설명서를 읽어보기 바랍니다.

  • declare 명령어 속성 설정 옵션

    옵션 의미
    -a 변수를 배열로 다룸
    -A 변수를 해시(연상배열)로 다룸(bash 4.0 이상)
    -i 변수를 정수로 다룸
    -r 변수를 읽기 전용으로 다룸(readonly 명령어와 같음)
    -x 변수를 환경 변수로 다룸(export 명령어와 같음)
  • declare 명령어 참조 옵션

    옵션 의미
    -f <함수명> 현재 정의한 셸 함수와 그 내용을 표시<함수명>을 생략하면 정의한 모든 셸 함수와 그 내용을 나열함
    -F <함수명> 현재 정의한 셸 함수 이름만 표시<함수명>을 생략하면 정의한 모든 셸 함수의 함수명을 나열함
    -p <변수명> 현재 정의한 변수명과 그 내용을 표시<변수명>을 생략하면 정의한 모든 변수와 그 값을 나열함

declare 명령어 사용법을 알아봤으니 예제를 봅시다. 예제에서는 제어 구문 예제2 를 사용하므로 스크립트 동작 개요는 해당 항목을 참조하기 바랍니다. 전에는 반복문 카운터를 seq 명령어로 생성했는데 여기에서는 정수값으로 선언한 셸 변수 count를 이용합니다.

1은 delcare 명령어에 정수를 선언한 -i 옵션을 이용합니다. 이렇게 하면 셸 변수 count는 정수값으로 다루게 되어서 산술확장(Arithmetic Expansion)을 적용할 수 있습니다.

2는 셸 변수 count를 정수값으로 정의했기에 사용 가능한 방법입니다. 보통 sh 스크립트라면 이 줄은 다음처럼 expr 명령어로 계산해야 합니다.

count=$(expr $count + 1)

하지만 2에서 일반적인 프로그래밍 언어와 같은 <변수명>=<변수명>+1이라는 문법을 이용할 수 있습니다. 또한 변수명에 $를 붙이지 않아도 됩니다. 반복 횟수가 많을 때 expr 명령어를 그때마다 실행하면 처리 시간이 늘어나게 되는데 산술 확장은 bash 기능이므로 외부 명령어를 매번 실행하지 않아도 되어 처리가 빨라집니다.

2를 C언어 문법으로 다음과 같이 쓸 수있습니다.

count+=1

그 외에도 산술 확장은 $(())라는 문법으로 적을 수 있습니다. 이런 산술 확장은 예제 126 을 참조하기 바랍니다.

   

주의사항

  • Mac에서는 sh의 기능이 확장되어서 예제에서 다룬 산술식을 bash가 아니더라도 사용할 수 있습니다. 하지만 기본적으로 산술식은 bash 기능이므로 sh에서 사용하는 것을 피하는 것이 좋습니다.

  • Free BSD에는 curl이 기본 설치되어 있지 않으므로 fetch 명령어를 대신 사용하기 바랍니다.

    fetch "$url"