[리눅스 유닉스 완전정복 목차]
안녕하세요
프로그래밍 문법 기초! 하면 배열이죠~~!
오늘은 C언어, 자바언어 아닌, 셸 스크립트에서 배열 사용법에 대해 작성해보려고 합니다.
[목차]
유닉스 셸 프로그래밍 배열 사용법
사실 그동안 단순 명령어는 셸 종류간 큰 차이가 없어 보였는데.. 배열은 문법이 좀 다른편이예요.
그러므로 자신이 사용하는 셸이 뭔지 확인하고 실습을 진행해봅시다.
배열 정의하기, 배열 선언 및 초기화
배열 정의할 때~~~
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에 저장되어있는 값을 출력하는 코드예요.
결과를 보시면, 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에서 나온 결과 파일들만 배열에 저장한다던가..
이렇게 사용하면 개발할때 활용할 일이 많겠죠~
오늘은 간단하게 셸 프로그래밍에서 사용하는 기본적인 배열 사용법에 대해 알아봤어요.
도움이 되었다면 공감은 어떤가요? 작성자에게 힘이 됩니다 :) 그럼 다음에 또 봐요~!
'별걸다하는 IT > 리눅스 유닉스' 카테고리의 다른 글
가상머신 VMware 버전 수동 업데이트 하는 법 (0) | 2022.01.10 |
---|---|
[리눅스/유닉스] AWK 명령어 기본적인 사용문법 - NF/NR 그리고 패턴과액션 (0) | 2021.12.15 |
[리눅스/유닉스] basename, dirname 파일명만 추출하기, 파일경로 추출하기, 확장자 제거 (0) | 2021.11.05 |
1902회 리눅스마스터 1급 1차 필기 1과목 1탄 [1-10문항] 기출문제 풀이 해설 답안 (0) | 2021.03.12 |
2002회 리눅스마스터 1급 1차 필기 1과목 2탄 [11-20문항] 문제 풀이 해설 (0) | 2021.03.11 |
최신 댓글