2019년 11월 22일 금요일

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮)

찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다.
왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10

Array

# 생성
declare -a empty_array
declare -a ar=(haha hoho baba "long string haha hoho")

# 접근
echo "ar[0]=${ar[0]}"

echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다.
echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다.

echo "indexes=${!ar[@]}"
echo "indexes=${!ar[*]}"

echo "length=${#ar[@]}"
echo "length=${#ar[*]}"

echo "last=${ar[-1]}"
echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식

# 현재 상황
declare -p ar
#(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho")

ar[100]=hello # 인덱스를 건너 뛰어도 동작한다.
declare -p ar
#(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho" [100]="hello")

ar[-1]=last # 마지막 원소에 대입한다.
declare -p ar
#(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho" [100]="last")

ar[-2]=whoami # 마지막 원소에서 왼쪽으로 한 칸 더 간다. 없는 인덱스이므로, 새로 만든다.
declare -p ar
#(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho" [99]="whoami" [100]="last")

# 추가
ar+=(blar)
ar+=(keke 123 456)
ar+=("long long long string" "another long long long string")

# 삭제
unset 'ar[3]' # 인덱스로 삭제

# 루프1: 골뱅이접근
# 원소를 각각 전달한다. 어지간하면 별표보다 골뱅이로만 쓰자.
for i in "${ar[@]}"; do
  echo "${i}"
done

# 루프2: 별표접근
# 원소를 문자열 하나로 뭉쳐서 한꺼번에 전달한다.
# 원하는 결과가 나오지 않는다... 아래 루프는 1회 돈다.
for i in "${ar[*]}"; do
  echo "${i}"
done

# 루프3: 인덱스로 접근
for i in "${!ar[@]}"; do
  echo "${i}=${ar[${i}]}"
done

Map

# 생성
declare -A empty_map
declare -A map=([hello]='world' [long]='long long long string' [what is it]=123)
declare -p map
#(출력) declare -A map=([long]="long long long string" ["what is it"]="123" [hello]="world" )

echo "map[hello]=${map[hello]}"
key=hello
echo "map[key]=${map[${key}]}"

echo "all=${map[@]}"
echo "keys=${!map[@]}"
echo "length=${#map[@]}"

# 추가
map+=([key1]=value)
map+=([key2]=value2 [key3]=value3)
map+=(['long key']='long long long value')
map['like a C++']='value!!!!!'

# 삭제
unset 'map[intput1]' # 키로 삭제

# 루프1: 골뱅이 접근
# 키를 알아낼 방법이 없다.
for i in "${map[@]}"; do
  echo "${i}"
done

# 루프2: 키로 접근
for key in "${!map[@]}"; do
  echo "map[${key}]=${map[${key}]}"
done

댓글 없음 :

댓글 쓰기