본문 바로가기
IT일반/Linux

Command Line - 배열

by 버섯도리 2022. 6. 18.
[cmd_test@btjeon-naver ~]$ a[1]=foo
[cmd_test@btjeon-naver ~]$ echo ${a[1]}
foo
[cmd_test@btjeon-naver ~]$ declare -a a

배열 생성 예제. 원소를 할당해서 접근할 수 있으며, -a 옵션을 사용하여 생성할 수도 있다.

 

[cmd_test@btjeon-naver ~]$ days=(Sun Mon Tue Wed Thu Fri Sat)
[cmd_test@btjeon-naver ~]$ days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)

배열 값 할당 예제

 

[cmd_test@btjeon-naver ~]$ vi hours.sh
-------------------------------------------------------------------------------------------
#!/bin/bash

# hours : script to count files by modification time

usage () {
        echo "usage: $(basename $0) directory" >&2
}

# Check that argument is a directory
if [[ ! -d $1 ]]; then
        usage
        exit 1
fi

# Initialize array
for i in {0..23}; do hours[i]=0; done

# Collect data
for i in $(stat -c %y "$1"/* | cut -c 12-13); do
        j=${i/#0}
        ((++hours[j]))
        ((++count))
done

# Display data
echo -e "Hour\tFiles\tHour\tFiles"
echo -e "----\t-----\t----\t-----"
for i in {0..11}; do
        j=$((i + 12))
        printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]}
done
printf "\nTotal files = %d\n" $count
-------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./hours.sh .
Hour	Files	Hour	Files
----	-----	----	-----
00	0	12	1
01	0	13	11
02	0	14	9
03	0	15	9
04	0	16	10
05	0	17	12
06	16	18	3
07	0	19	0
08	0	20	0
09	10	21	0
10	13	22	0
11	10	23	0

Total files = 104

배열 변수를 사용하여 최근 수정된 파일들을 시간대별로 보여주는 스크립트 예제

stat 명령어와 cut 명령어를 통해 2자리수의 시간 정보를 추출한다. 쉘이 00부터 09까지의 값을 8진수로 해석하려 하기 때문에 루프 내부에서 시간 필드의 맨 첫자리 0을 제거한다. (j=${i/#0})

 

[cmd_test@btjeon-naver ~]$ for i in ${animals[*]}; do echo $i; done
a
dog
a
cat
a
fish
[cmd_test@btjeon-naver ~]$ for i in ${animals[@]}; do echo $i; done
a
dog
a
cat
a
fish
[cmd_test@btjeon-naver ~]$ for i in "${animals[*]}"; do echo $i; done
a dog a cat a fish
[cmd_test@btjeon-naver ~]$ for i in "${animals[@]}"; do echo $i; done
a dog
a cat
a fish

배열의 모든 내용 출력. * 표기법은 배열의 내용을 포함한 한 단어를 반환하는 반면 @ 표기법은 배열의 "실제" 내용인 세 단어를 결과로 출력한다.

 

[cmd_test@btjeon-naver ~]$ b[100]=foo
[cmd_test@btjeon-naver ~]$ echo ${#b[@]} # number of array elements
1
[cmd_test@btjeon-naver ~]$ echo ${#b[100]} # length of element 100
3

첫번째는 @ 기호와 매개변수 확장(#)을 사용하여 원소의 갯수를 확인한다.

두번째는 100번 원소의 길이를 확인한다.

 

[cmd_test@btjeon-naver ~]$ foo=([2]=a [4]=b [6]=c)
[cmd_test@btjeon-naver ~]$ for i in "${foo[@]}"; do echo $i; done
a
b
c
[cmd_test@btjeon-naver ~]$ for i in "${!foo[@]}"; do echo $i; done
2
4
6
[cmd_test@btjeon-naver ~]$ for i in "${!foo[*]}"; do echo $i; done
2 4 6

!를 사용하여 매개변수 확장을 하면 배열의 인덱스를 검색할 수 있다.

 

[cmd_test@btjeon-naver ~]$ foo=(a b c)
[cmd_test@btjeon-naver ~]$ echo ${foo[@]}
a b c
[cmd_test@btjeon-naver ~]$ foo+=(d e f)
[cmd_test@btjeon-naver ~]$ echo ${foo[@]}
a b c d e f

+= 할당 연산자를 사용하여 자동적으로 배열의 끝에 추가할 수 있다.

 

[cmd_test@btjeon-naver ~]$ vi array-sort.sh
------------------------------------------------------------------------------------------
#!/bin/bash

# array-sort : Sort on array

a=(f e d c b a)
echo "Original array:   ${a[@]}"
a_sorted=($(for i in "${a[@]}"; do echo $i; done | sort))
echo "Soretd array:     ${a_sorted[@]}"
------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./array-sort.sh 
Original array:	f e d c b a
Soretd array:	a b c d e f

배열 정렬하기 (sort 명령어 사용)

 

[cmd_test@btjeon-naver ~]$ foo=(a b c d e f)
[cmd_test@btjeon-naver ~]$ echo ${foo[@]}
a b c d e f
[cmd_test@btjeon-naver ~]$ unset foo
[cmd_test@btjeon-naver ~]$ echo ${foo[@]}

[cmd_test@btjeon-naver ~]$ foo=(a b c d e f)
[cmd_test@btjeon-naver ~]$ echo ${foo[@]}
a b c d e f
[cmd_test@btjeon-naver ~]$ unset 'foo[2]'
[cmd_test@btjeon-naver ~]$ echo ${foo[@]}
a b d e f

unset 명령어로 배열 혹은 배열 원소들을 삭제할수 있다. (배열 원소는 쉘의 경로명 확장을 방지하기 위해 반드시 따옴표가 사용되어야 한다.)

 

[cmd_test@btjeon-naver ~]$ foo=(a b c d e f)
[cmd_test@btjeon-naver ~]$ foo=
[cmd_test@btjeon-naver ~]$ echo ${foo[@]}
b c d e f
[cmd_test@btjeon-naver ~]$ foo=(a b c d e f)
[cmd_test@btjeon-naver ~]$ echo ${foo[@]}
a b c d e f
[cmd_test@btjeon-naver ~]$ foo=A
[cmd_test@btjeon-naver ~]$ echo ${foo[@]}
A b c d e f

값 할당시 인덱스 사용 없이 배열 변수를 참조하면 인덱스 0 값에 할당된다.

 

 

 

 

 

 

출처 : 리눅스 커맨드라인 완벽 입문서

 

'IT일반 > Linux' 카테고리의 다른 글

Command Line - 그 외 유용한 툴들  (0) 2022.06.22
VI editor reference  (0) 2022.06.21
Command Line - 문자열과 수  (0) 2022.06.17
Command Line - 흐름 제어 : for 루프  (0) 2022.06.13
Command Line - 위치 매개변수  (0) 2022.06.08