섹션 6. 배열

 

리눅스 서버를 자동화하여 관리하기 위한 쉘 스크립트(Shell Script) 심화 강좌를 정리합니다.
출처 : inflearn

1. 배열

배열은 쉼표가 아닌 공백으로 분리 해야 함.

linux:/home/shkim$ declare -a array1=("water" "blue" "super")
linux:/home/shkim$ declare -a array2=("melon" "mountain" "stars")
linux:/home/shkim$ for i in "${!array1[@]}"; do
>     printf "%s\t%s\t%s\n" "$i" "${array1[$i]}" "${array2[$i]}"
> done
0       water   melon
1       blue    mountain
2       super   stars
linux:/home/shkim$ 

2. 배열과 glob 그리고 루프문

linux:/home/shkim$ ARRAY=( "sky:blue" "snow:white" "night:black" "apple:red" )
linux:/home/shkim$ for object in "${ARRAY[@]}" ; do
>     KEY=${object%%:*}
>     VALUE=${object#*:}
>     printf "%s's color is %s.\n" "$KEY" "$VALUE"
> done
sky's color is blue.
snow's color is white.
night's color is black.
apple's color is red.
linux:/home/shkim$ 
linux:/home/shkim$ files=$(ls) # bad , 단순 문자열
linux:/home/shkim$ files=($(ls)) # bad, 배열의 형태
linux:/home/shkim$ files=(*) # good, 파일 목록을 가져올때 glob 를 이용해야 한다.

실습(DRILL)

  • 스크립트 실행시 파일이 생성되어야 하고, 파일의 내용은 아래와 같아야함.
  • hint : read, for loop, 배열, IFS 활용
linux:/home/shkim$ cat tech.txt
youtube,ai,alphago,arduino,IOT

linux:/home/shkim$ ./makeTagDirectory.sh tech.txt
linux:/home/shkim$ ll youtube.md ai.md alphago.md arduino.md IOT.md # 파일이 생성되도록 작성
linux:/home/shkim$ cat ai.md
---
name: ai
title: 'ai'
--- 

정답

#!/bin/bash

IFS=$',' read -r -a array < $1
for element in "${array[@]}" ;do
    echo "----" > "$element.md"
    echo "name: $element" >> "$element.md"
    echo "title: '$element'" >> "$element.md"
    echo "----" >> "$element.md"
done

3. find 와 print0

linux:/home/shkim/b$ ll
total 0
-rw-rw-r-- 1 shkim shkim 0 Nov 19 00:35 For Whom the Bell Tolls.mp3
-rw-rw-r-- 1 shkim shkim 0 Nov 19 00:35 Gone With the Wind.mp3
-rw-rw-r-- 1 shkim shkim 0 Nov 19 00:35 old man and ?the sea.mp3

# 하기 명령어로 mp3 파일이 삭제될거라고 생각했지만 삭제되지 않음.
linux:/home/shkim/b$ find . -name "*.mp3" | xargs rm -rf
linux:/home/shkim/b$ ll
total 0
-rw-rw-r-- 1 shkim shkim 0 Nov 19 00:35 For Whom the Bell Tolls.mp3
-rw-rw-r-- 1 shkim shkim 0 Nov 19 00:35 Gone With the Wind.mp3
-rw-rw-r-- 1 shkim shkim 0 Nov 19 00:35 old man and ?the sea.mp3
# 삭제되지 않은 이유 : 파일의 공백이 포함되어 있고 줄바꿈 문자가 포함되어 있음.
linux:/home/shkim/b$ find . -name "*.mp3" | xargs ls -al
ls: cannot access ./For: No such file or directory
ls: cannot access Whom: No such file or directory
ls: cannot access the: No such file or directory
ls: cannot access Bell: No such file or directory
ls: cannot access Tolls.mp3: No such file or directory
ls: cannot access ./old: No such file or directory
ls: cannot access man: No such file or directory
ls: cannot access and: No such file or directory
ls: cannot access ?the: No such file or directory
ls: cannot access sea.mp3: No such file or directory
ls: cannot access ./Gone: No such file or directory
ls: cannot access With: No such file or directory
ls: cannot access the: No such file or directory
ls: cannot access Wind.mp3: No such file or directory

# 파일 hexdump / 20: 공백, 0a: 줄바꿈
linux:/home/shkim/b$ find . -iname "*.mp3" | hexdump -C
00000000  2e 2f 46 6f 72 20 57 68  6f 6d 20 74 68 65 20 42  |./For Whom the B|
00000010  65 6c 6c 20 54 6f 6c 6c  73 2e 6d 70 33 0a 2e 2f  |ell Tolls.mp3../|
00000020  6f 6c 64 20 6d 61 6e 20  61 6e 64 20 3f 74 68 65  |old man and ?the|
00000030  20 73 65 61 2e 6d 70 33  0a 2e 2f 47 6f 6e 65 20  | sea.mp3../Gone |
00000040  57 69 74 68 20 74 68 65  20 57 69 6e 64 2e 6d 70  |With the Wind.mp|
00000050  33 0a                                             |3.|
00000052
# print0 은 find 명령어에 의해 검색된 모든 검색 결과의 마지막에 널문자를 넣어줌
# 널문자 00 으로 파일의 시작과 끝을 알 수 있음.
linux:/home/shkim/b$ find . -iname "*.mp3" -print0 | hexdump -C
00000000  2e 2f 46 6f 72 20 57 68  6f 6d 20 74 68 65 20 42  |./For Whom the B|
00000010  65 6c 6c 20 54 6f 6c 6c  73 2e 6d 70 33 00 2e 2f  |ell Tolls.mp3../|
00000020  6f 6c 64 20 6d 61 6e 20  61 6e 64 20 3f 74 68 65  |old man and ?the|
00000030  20 73 65 61 2e 6d 70 33  00 2e 2f 47 6f 6e 65 20  | sea.mp3../Gone |
00000040  57 69 74 68 20 74 68 65  20 57 69 6e 64 2e 6d 70  |With the Wind.mp|
00000050  33 00                                             |3.|
00000052

# xargs 뒤에 -0 은 문자열을 널문자로 분리하려면 필수적으로 써야하는 옵션임.
linux:/home/shkim/b$ find . -iname "*.mp3" -print0 | xargs -0 ls -al
-rw-rw-r-- 1 shkim shkim 0 Nov 19 00:35 ./For Whom the Bell Tolls.mp3
-rw-rw-r-- 1 shkim shkim 0 Nov 19 00:35 ./Gone With the Wind.mp3
-rw-rw-r-- 1 shkim shkim 0 Nov 19 00:35 ./old man and ?the sea.mp3

# 정상적으로 삭제됨.
linux:/home/shkim/b$ find . -name "*.mp3" -print0 | xargs -0 rm -rf
linux:/home/shkim/b$ ls

4. 명령어(find)