본문 바로가기

별걸다하는 IT/리눅스 유닉스

[유닉스/리눅스] 배열 사용법, 셸 스크립트 배열 문법 (ksh, bash shell array)

반응형

[리눅스 유닉스 완전정복 목차]

안녕하세요

프로그래밍 문법 기초! 하면 배열이죠~~!

오늘은 C언어, 자바언어 아닌, 셸 스크립트에서 배열 사용법에 대해 작성해보려고 합니다.

 

[목차]

1. 배열 선언하고 초기화 하는법

2. 배열 요소에 접근하는 법

3. 배열 전체 값 출력하기

4. 배열 요소 개수 확인

5. 명령어 결과를 배열에다가 저장하기

 

유닉스 셸 프로그래밍 배열 사용법

사실 그동안 단순 명령어는 셸 종류간 큰 차이가 없어 보였는데.. 배열은 문법이 좀 다른편이예요.

그러므로 자신이 사용하는 셸이 뭔지 확인하고 실습을 진행해봅시다.

 

배열 정의하기, 배열 선언 및 초기화

배열 정의할 때~~~ 

ksh(콘셸)과 bash(배시)가 좀 다릅니다.

 

♣ 콘셸(ksh)에서 배열 선언법

콘셸에서는 배열을 정의할 때 set -A 명령어를 사용해요.

요러면 ary라는 배열이 선언된거예요. 쉽죵~

배열선언할때 초기화를 같이 해주고 싶다면, 뒤에 요소들을 같이 입력해주면 됩니다.

#1. ary1 배열변수 선언하기
set -A ary1 

#2. 1,2,3 을 요소로 가지는 ary2 배열
set -A ary2 1 2 3

#3. "array" "test"를 요소로 가지는 ary3 배열
set -A ary3 "array" "test"

정리하자면 요렇게 됩니다. 쉽죠?

만약 요소가 문자열인데 띄어쓰기로 되어있으면 "array test" 요렇게 하나의 큰따옴표로 묶어줘야 하나의 요소로 인식해요.

♣ 배시(bash)에서 배열 선언법

배시에서는 배열을 선언만 할꺼면 declare라는 키워드를 사용해주면 돼요.

'declare -a ary' ary라는 변수명을 가진 배열을 선언한다.

요렇게 괄호를 사용하면 초기화와 선언을 같이 할 수 있어요.

참고로 bash에서는 set -A 명령어는 먹지 않으니, 주의~~ set -A는 ksh에서 배열 사용할 때 사용하는 키워드입니다.

 

배열 요소 접근하기

배열요소 접근은 흔히 우리가 하는 C, JAVA에서 사용하는 법과 동일합니다. ary[0], ary[1], ary[2] 요런식?

특정 인덱스에다가 값을 대입하고 싶다 하면 ary[0]="hello" 요렇게 해주면 돼요.

이전에 변수 영상에서 다뤘던 것과 동일하게, 해당 변수에 있는 값을 출력해줄 때에는 ${ary[0]} 요렇게 $로 감싸서 접근하시면 됩니다.

 

혹 셸스크립트 변수에 대한 개념이 잡혀있지 않다면 요 포스팅을 참고해주세요

2019.10.01 - [별걸다하는 IT/리눅스 유닉스] - [linux/unix/스크립트]셸 프로그래밍 변수사용법 - 변수와 특수문자,빈 변수, 변수의 종류~ 변수총정리

 

간단하게 스크립트 하나 짜볼까요?

set -A arr #ksh의 경우
#bash의 경우 declare -a arr
arr[0]="apple"
arr[1]="banana"
arr[2]="tomato"
echo "${arr[1]}"

arr 배열 변수를 선언하고,

첫번째 요소(index0)에는 apple을 저장, 

두번째 요소(index1)에는 banana를 저장,

세번째 요소(index2)에는 tomato를 저장,

마지막 문법은, arr배열에서 index1에 저장되어있는 값을 출력하는 코드예요.

ksh에서 테스트

결과를 보시면, banana만 잘 출력된 것을 확인할 수 있습니다. 

 

배열 전체 요소 접근하기, ${ary[@]}와 ${ary[*]}차이

이렇게 원하는 위치의 배열 값만 확인하고 싶을 수도 있지만, 

배열에 저장되어 있는 데이터 전체를 확인하고 싶을때도 많겠죠.

배열 전체 요소를 출력하고 싶을 때에는 요 두 문법중 하나를 사용하면 됩니다.

둘 차이는 거의 미미하긴 한데, 설명하자면 위치매개변수 $@와 $*차이랑 동일해요.

 

위치매개변수 또는 아규먼트 변수에 대해 잘 모르시는 분은 아래 포스팅을 참고하시면 좀 도움이 되실거예요.

2019.10.02 - [별걸다하는 IT/리눅스 유닉스] - [Linux/Unix/Shell programming] 위치 매개 변수, 특수매개변수, 아규먼트 변수 종류

 

위치매겨변수 포스팅 내용 일부

요기 보시는 것처럼, ${ary[*]}는 배열 요소 전체를 하나의 아규먼트로 보고, 요소를 띄어쓰기(IFS)로 구분합니다.

반면 ${ary[@]}는 마치 여러 요소가 있는 리스트처럼 다뤄요.

 

간단하게 스크립트로 테스트를 해볼까요

set -A arr 1 2 3 4 #ksh일 경우
#bash일 경우 arr=(1 2 3 4)
echo "*테스트"
echo "${arr[*]}"

echo "@테스트"
echo "${arr[@]}"

echo "start *테스트"
for n in "${arr[*]}"
do
	echo "$n"
done

echo "start @테스트"
for n in "${arr[@]}"
do
	echo "$n"
done

${arr[*]}와 ${arr[@]} 차이를 비교하기 위해 위와 같이 작성해봤어요.

결과를 보시면 그냥 전체를 출력했을 때에는 차이가 없는 것 같은데,

요소 하나 하나 뽑아서 반복문으로 돌려보면 echo로 출력했을 때 "${arr[*]}"는 한 줄로 출력이 되고,

"${arr[@]}"는 각기 다른 요소로 4번, 따라서 4줄로 출력된 것을 확인할 수 있어요.

 

배열 요소 개수

전체 배열 개수를 알고 싶을 경우 어떻게 할까요?

#을 붙여주면 된답니다~~

기억하고 계시는 분 있을 지 모르겠지만, 변수앞에 #을 붙이고 출력하면 값의 글자수를 출력해줬던거 기억하시나요?

var="hello"였을 때, echo ${#var} 하면 결과로 5가 나와요 ㅎㅎ 

 

ary[@]요렇게 하면 전체인데, 요 앞에 #을 붙이면 총 배열 개수가 출력됩니다. 

set -A ary "apple" "banana" "grape"
#bash일 경우 ary=("apple" "banana" "grape")
echo "배열개수" ${#ary[@]}
i=0 #초기화
while [ $i -lt ${#ary[@]} ] # while(i<배열요소개수) 요거랑 같은 문법인거죠
do 
    echo ${ary[i]}
    let i=i+1
done

배열 요소 처음부터 끝까지 차례대로 접근해서 값을 추출하는 스크립트를 짜봤어요 ㅎㅎ

주의할 점은 무한루프 걸리지 않게 꼭 n 값을 하나씩 올려주기!

배열개수와 배열요소 값이 차례대로 정상적으로 출력됨을 확인할 수 있어요.

 

명령어 결과값을 배열에 저장하기

set -A ARR=`cat test.txt | awk '{print $1}'`

set -A ARR=`grep -l hello`

set -A ARR=`cat test.txt | cut -f 1 -d '/'`

``를 쓰면 명령어를 수행하는건데요, 요런식으로 명령어 수행 결과를 배열로 저장할 수 있답니다.

경로에서 파일들만 뽑아서 배열에 저장한다던가,,

grep에서 나온 결과 파일들만 배열에 저장한다던가..

이렇게 사용하면 개발할때 활용할 일이 많겠죠~

 

오늘은 간단하게 셸 프로그래밍에서 사용하는 기본적인 배열 사용법에 대해 알아봤어요.

도움이 되었다면 공감은 어떤가요? 작성자에게 힘이 됩니다 :) 그럼 다음에 또 봐요~!

반응형