woonizzooni

쉘 스크립트 - 배열 다뤄보기 / 배열 선언 / 배열끼리 병합 등... 본문

Programming/Shell-script

쉘 스크립트 - 배열 다뤄보기 / 배열 선언 / 배열끼리 병합 등...

woonizzooni 2021. 6. 18. 15:29

 

 

MacOS나 Linux에서 친숙한(?) bash, zsh등에서 보통 아래와 같이 사용했는데.. (파일명 : a.sh)

#!/bin/sh

declare -i count=1

a=(abc 123 def)
b=(ghi 456 kkk)

echo ">>> print a"
for item in ${a[@]}
do
    printf " %d:%s\n" $count $item
    count+=1
done

count=1
c=(${a[@]} ${b[@]})

echo ">>> print all"
for item in "${c[@]}"
do
    printf " %d:%s\n" $count $item
    count+=1
done

실행결과

>>> print a
 1:abc
 2:123
 3:def
>>> print all
 1:abc
 2:123
 3:def
 4:ghi
 5:456
 6:kkk

 

이걸 그대로 alpine 리눅스 등 경량화 쉘(?)에서 실행하면

./a.sh: line 3: declare: not found
./a.sh: line 5: syntax error: unexpected "("

 

정수형 변수야 그렇다 치고(=declare 미지원)

괄호 표현식에서 syntax error! 음...

 

 

배열 표현을 공백(space)을 사용한 문자열로 만들고,

set 과 shift를 이용해서 다음과 같이 작성해봄.

# !/bin/sh

count=1

a="abc 123 def"
b="ghi 456 kkk"

echo ">>> print a"
set -- $a
while [ -n "$1" ];
do
    printf " %d:%s\n" $count $1
    count=`expr $count + 1 `
    shift
done


echo ">>> print all"
count=1
set -- $a $b
while [ -n "$1" ]; do
    printf " %d:%s\n" $count $1
    count=`expr $count + 1 `
    shift
done

 

동일한 결과를 얻음.

 

>>> print a
 1:abc
 2:123
 3:def
>>> print all
 1:abc
 2:123
 3:def
 4:ghi
 5:456
 6:kkk

 

 

모든 쉘, 아니 일단 안되던 alpine 리눅스 쉘과 내 맥 쉘에서 정상 동작함.

이렇게 하자.

 

 

 

[참고]

set

   https://pubs.opengroup.org/onlinepubs/009696799/utilities/set.html

https://www.ibm.com/docs/ko/i/7.3?topic=variables-set 

 

bash append to array

https://linuxhint.com/bash_append_array/

 

 

Comments