본문 바로가기

스터디/리눅스 커맨드라인

[리눅스] 35. 배열

 

1. 배열이란?

배열은 하나 이상의 값을 가지고 있는 변수다. 배열은 테이블과 같은 형태로 구성된다. 스프레드시트를 예로 들어보자. 스프레드시트는 이차원 배열처럼 동작한다. 행과 열이 있고, 스프레드시트의 셀들을 가지고 있다. 배열도 같은 방식으로 동작한다, 배열은 원소라고 부르는 셀들을 가지고 있다. 그리고 각 원소들은 데이터를 가지고 있다. 각 배열 원소에는 인덱스 혹은 첨자라 불리는 주소를 사용하여 접근할 수 있다.
대부분 프로그래밍 언어들이 다차원 배열을 지원한다.

 

 

2. 배열 생성

배열 변수는 다른 bash 변수들처럼 이름을 붙일 수 있고 저븐 시에 자동적으로 변수가 만들어진다.
$ a[1]=foo
$ echo ${a[1]}

foo​

 

원소 1에 값 foo가 할당되고, 원소 1에 저장된 값을 echo 명령어를 사용하는 코드이다.

 

 

3. 배열에 값 할당

할당하는 방법은 두 가지가 있는데 그 중 하나는 단일 값을 할당할 수 있는 방식이다.
" name[subscript]=value "
name : 배열의 이름,
subscript : 0과 같거나 보다 큰 정수(또는 산술식)

두 번째 방식은 복수의 값들도 할당할 수 있는 방식이다.
" name=( value1 value2 ... ) "
$ days=(Sun Mon Tue Wed Fri Sat)

$ days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Fri [5]=Sat)​

위 코드 두 줄 다 같은 의미이다.

 

 

4. 배열 연산

(1) 배열의 모든 내용 출력
첨자 *와 @는 배열의 모든 원소를 접근하는 데 사용된다. 위치 매개변수와 함께함으로써 둘 중 @ 기호가 더 유용하다.
$ animals=("a dog" "a cat" a fish")

# 1
$ for i in ${animals[*]}; do echo $i; done
a
dog
a
cat
a
fish

# 2
$ $ for i in ${animals[@]}; do echo $i; done
a
dog
a
cat
a
fish

# 3
$ for i in "${animals[*]}"; do echo $i; done
a dog a cat a fish

# 4
$ for i in $"{animals[@]}"; do echo $i; done
a dog
a cat
a fish​
animals 배열을 만들고 두 단어로 된 문자열 세 개를 할당한다. 그러고 나서 배여 ㄹ내용에서 단어 분할이 이뤄지는 것을 살펴보자.
${animals[*]}와 ${animals[@]} 표기는 인용되지 전까지 동일하게 동작한다.
* 표기법은 배열의 내용을 포함한 한 단어를 반환하는 반면, @ 표기법은 배열의 "실제" 내용인 세 단어를 결과로 출력한다.

(2) 배열 원소 수 확인
매개변수 확장을 사용하여 문자열 길이를 찾는 것과 거의 동일한 방식으로 배열 원소의 개수를 확인할 수 있다.
$ a[100]=foo
$ echo ${#a[@]}
1

$ echo ${#a[100]}
3​

 

배열을 만들고 100버 원소에 foo 문자열을 할당한다. 그 다음 배열 길이를 확인하기 위해 @ 기호와 함께 매개변수 확장을 사용한다. 마지막으로 foo 문자열을 가진 100번 원소 길이를 확인한다. 100번 원소에 문자열으 할당했지만, bash는 단지 배열에 하나의 원소만 있다고 인식한다.

(3) 배열 내의 사용된 첨자 검색
bash는 배열의 첨자 할당에서 공백을 허용한다. 종종 실제로 존재하는 원소를 확인하는 데 유용하다.
$ foo=([2]=a [4]=b [6]=c)
$ foo i in "${foo[@]}"; do echo $i; done
a
b
c

$ foo i in "${!foo[@]}"; do echo $i; done
2
4
6​

(4) 배열 끝에 원소 추가
배열 끝에 값을 추가하려고 하는 경우, 배열의 원소 수를 아는 것은 아무런 도움이 되지 못한다. 그 이유은 *와 @ 표기법은 사용 중인 최대 배열 인덱스를 말해주지 않기 때문이다. 
+= 할당 연산자를 사용하여 자동적으로 배열의 끝에 값을 추가할 수 있다.

$ foo=(a b c)
$ echo ${foo[@]}
a b c

$ foo+=(d e f)
$ echo ${foo[@]}
a b c d e f


(5) 배열 정렬
스프레드시트처럼, 종종 데이터 칼럼의 값들을 정렬할 필요가 있다.

a=(f e d c b a)
a_sorted=($(for i in "$a[@]"; do echo $i; done | sort))


(6) 배열 삭제

$ foo=a b c d e f)
$ unset 'foo[2]'
echo ${foo[@]}
a b d e f