<In Story>

Shell Script 기본 - 2.기본 문법 (3) 배열 // [Unix] [Linux] [Script] [Programming] 본문

Programming/Script

Shell Script 기본 - 2.기본 문법 (3) 배열 // [Unix] [Linux] [Script] [Programming]

<In Story, Hi story, History> 2015. 5. 25. 13:00

http://ktdsoss.tistory.com/125



(3) 배열

 

배열을 선언하여 값을 할당하는 방법에는 크게 두 가지 정도가 있습니다.

 

하나는 배열의 인덱스 하나하나를 구분하여 각각의 인덱스에 일일이 값을 지정하는 방법과, 또 다른 하나는 뭉탱이로 배열에 값을 넣어주는 방법입니다.

 

먼저 인덱스 하나하나에 값을 따로따로 지정하는 방법은 다음과 같습니다.


array[0]='Shell'

array[1]='Script'

array[2]='Programming'



위 예제의 경우, 인덱스 '0'에는 'Shell'이란 문자열이, 인덱스 '1'에는 'Script'란 문자열이, 인덱스 '2'에는 'Programming'이란 문자열이 각각 지정되었습니다.

 

위와 같이 지정한 후, 다른 라인에서 해당 배열 변수값을 호출하고자 할 때는 아래와 같이 사용하면 됩니다.


echo ${array[0]}

echo ${array[1]}



버퍼에 있는 변수값을 호출하려 할 때, '$'를 붙여서 사용하면 된다는 것은 앞의 글에서 이미 설명 드렸었습니다.

 

헌데, 위 예시에는 그동안 사용하지 않았던 '{ }'(중괄호)가 들어가 있죠?

 

왜일까요?

 

다음과 같은 아주 간단한 스크립트가 있습니다.


 #!/bin/sh  

array[0]='Shell'
array[1]='Script'

 

echo $array[0] $array[1]

echo ${array[0]} ${array[1]}



위 스크립트를 실행시키면 첫 번째 echo 문의 결과값은 'Shell[0] Shell[1]' 이라고 출력되고, 두 번째 echo 문의 결과값은 'Shell Script'라고 출력됩니다.

 

이유인즉슨, '{ }'(중괄호)를 사용하여 array[0], array[1] 등을 하나의 변수로 처리해 주지 않으면, [0], [1] 등을 인식하지 못하고 해당 배열의 첫 번째 인덱스값만 불러오게 되어 있기 때문입니다.

 

꼭 배열을 사용할 때 뿐만 아니라, 많은 경우에서 '{ }'(중괄호)를 필요로 하게 됩니다.

 

'이것은 변수다'라는 것을 명시적으로 표기하여 소스의 가독성을 높이고자 한다면, 변수 호출 시마다 '{ }'(중괄호)를 붙여주는 것이 좋습니다.

 

다음은 뭉탱이로 배열에 값을 할당하여 주는 방법입니다.

 

뭉탱이로 배열에 값을 할당하는 방법도 몇 가지가 있는데, 그 중 사용이 쉽고 자주 쓰이는 두 가지 방식만 살펴보도록 하겠습니다.

 

첫 번째 방식은 다음과 같습니다.


array=(shell script programming)



일일이 값을 할당하는 방식에 비해 훨씬 간결하죠?

 

배열의 인덱스마다 일일이 값을 할당하나, 괄호를 사용하여 한 번에 할당하나 변수 호출의 결과는 같습니다.

 

또 다른 뭉탱이 할당 방식은 파일을 읽어들이는 것입니다.

 

다음 예제를 보시죠.


# cat test.txt

shell script programming

 

array=$(cat test.txt)

echo ${array[0]}



위와 같이 'shell script programming' 이라는 문자열을 담고 있는 파일이 있다면, shell 커맨드인 'cat' 을 이용하여 값을 불러와 배열에 할당할 수 있습니다.

 

Shell Script를 짜다 보면 여러 파일에서 값을 불러와 배열에 저장하고 사용하는 경우가 종종 생기는 데 그 때 위 예제처럼 사용하면 됩니다.

 

그리고 이전에도 한 번 강조했던 내용이지만, 배열 변수에 값을 할당할 때도 '='(equal) 앞뒤로 절대 공백이 존재하면 안된다는 것을 명심하시기 바랍니다.



-------------------------------------------------------------------------------------------------------------------


http://blog.redjini.com/282



배열(Array) : 선언하기

1
2
array_name_1=("value 1" "value 2" "value 3")
array_name_2=(1 2 3)

배열(Array) : 참조하기

1
2
3
4
5
6
7
8
9
array_name=("value 1" "value 2" "value 3")
 
echo "array_name[0]     = ${array_name[0]}"  #print array_name[0]
echo "array_name[2]     = ${array_name[2]}"  #print array_name[2]
echo "array_name[*]     = ${array_name[*]}"  #print array_name all item
echo "array_name[@]     = ${array_name[@]}"  #print array_name all item
echo "array_name index  = ${!array_name[@]}" #print array_name index number
echo "array_name size   = ${#array_name[@]}" #print array_name size
echo "array_name[0] size= ${#array_name[0]}" #print array_name[0] size

출력 결과

array_name[0]     = value 1
array_name[2]     = value 3
array_name[*]     = value 1 value 2 value 3
array_name[@]     = value 1 value 2 value 3
array_name index  = 0 1 2
array_name size   = 3
array_name[0] size= 7

배열(Array) : 크기 구하기

1
2
3
array_name_1=("value 1" "value 2" "value 3")
 
echo ${#array_name_1[@]}  #print "3"

배열(Array) : 출력하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
array_name=("value 1" "value 2" "value 3")
 
echo "array = ${array_name[@]}"
# 출력 결과
# array = value 1 value 2 value 3
 
printf "value = %s\n" "${array_name[@]}"
# 출력 결과
# value = value 1
# value = value 2
# value = value 3
 
for value in "${array_name[@]}"; do
    echo $value
done
# 출력 결과
# value 1
# value 2
# value 3
 
for (( i = 0 ; i < ${#array_name[@]} ; i++ )) ; do
    echo "value[$i] = ${array_name[$i]}"
done
# 출력 결과
# value[0] = value 1
# value[1] = value 2
# value[2] = value 3
 
for index in ${!array_name[*]} ; do
    printf "%4d: %s\n" "$index" "${array_name[$index]}"
done
# 출력 결과
#   0: value 1
#   1: value 2
#   2: value 3