declare -A
없이 사용할 수 있음AA=( 11 "hello world!" 22 )
AA[0]=11
idx=2
AA[idx]=33 # indexed array는 AA[$idx]로 안해도됨
echo ${AA[idx]}
declare -A
로 선언해야함declare -A arr
var=hello
arr=( [zero]=0 [one]=1 [two]=2 [$var]=3 )
echo arr[$var]
#!/bin/bash
declare -A DST
SSH_SERVER="ssh -p 8888 pi@10.100.0.1"
DST+=([0]="${SSH_SERVER}") <-- [0]="값" 넣는 것 유의!
for ((i=0; i<10; i++)); do
echo "${DST[$i]}"
echo "${DST[0]}"
done
혹은
DST+=([first]="${SSH_SERVER}")
echo "${DST[first]}"
VAR="first"
echo "${DST[$VAR]}"
compgen -A arrayvar
{ }
를 사용해야함{ }
없으면, $ARR[2] 와 같이하면 $ARR 변수가 먼저 확장되어 DST3[0]으로 확장됨ARR=(DST1 DST2 DST3)
echo $ARR[2] (x) --> DST1[2]
echo ${ARR[2]} --> DST3
@, *
차이" "
를 사용하지 않은 ${arr[@]}
와 ${arr[*]}
는 똑같은 IFS
에 의해 단어 분리가된다."${arr[@]}"
: 개개의 원소를 " "
로 quote"${arr[*]}"
: 모든 원소를 하나의 " "
안에 IFS
변수 값을 구분자로 하여 넣는 것과 같음예 | 출력 |
---|---|
"${arr[@]}" | "${arr[0]}" "${arr[2]}" "${arr[3]}" |
"${arr[*]}" | "${arr[0]X${arr[1]}X${arr[2]}" 사이사이 X 는 IFS 변수 값 중 첫 문자 |
AA=(11 22 33 44 55)
idx=2
echo ${AA[idx]} --> 33
echo ${AA[ idx + 1 ]} ---> 44
echo "${AA[ idx == 2 ? 3 : 4 ]}" ---> 44
declare -A CC
CC[$(echo aaa)}=1
CC[ $(echo aaa)}=2
CC[ $(echo aaa) ]=3
-->CC=(["aaa"]=1 [ "aaa"]=2 [ "aaa" ]=3)
표현식 | 설명 |
---|---|
${ #array[ @]} | 배열의 전체 원소 갯수 |
${ #array[ 3]} | indexed array 에서 배열의 idx 3 내용의 stirng 길이 |
${ #array[ hello]} | associative array 에서 배열의 idx = 'hello' 일 경우의 원소 string 길이 |
${array[ @]} | array 에서 배열의 전체 원소들 나열 |
${ !array[ @]} | array 에서 배열의 전체 원소 index들 나열 |
unset "arr[0]" # indexed array인 arr의 0 을 삭제
unset "arr[1]" # indexed array인 arr의 1 을 삭제
unset "arr[hello]" # associative array에서 idx가 hello인 원소 삭제
var="hello"
unset "arr[$var]"
AA=(11 22 33 44 55)
unset "AA[2]"
echo ${#AA[@]}
4 <--- 배열 길이는 반영됨
for line in "${AA[@]}"; do
echo "$line"
done
11
22
44
55 <--- for문도 정상적으로 동작
echo "${AA[2]}" <--- 하지만 공백으로 남아있음
방법 1
1. AA=( "${AA[@]}" ) # 재할당
방법 2
1. set -f; IFS='' <--- IFS 값을 null로 설정
2. AA=( ${AA[*] ) <--- quotes를 사용하지 않음
3. set +f; unset IFS
#!/bin/bash
DST1="'-e ssh -p 8888' mark@myhost.com:/dst1"
DST2="'-e ssh -p 9999' mark2@myhost2.com:/dst2"
DST3="'-e ssh -p 10000' mark3@myhost3.com:/dst3"
DST_LIST=("${DST1}" "${DST2}")
DST_LIST+=("${DST3}")
for line in "${DST_LIST[@]}"; do
echo "$line"
done
ORIGIN_DST_LIST_LEN=${#DST_LIST[@]}
for ((i=0; i<${ORIGIN_DST_LIST_LEN}; i++)); do
if [[ "${DST_LIST[i]}" =~ "9999" ]]; then
unset "DST_LIST[i]"
fi
done
echo "---------------------------------"
DST_LIST=("${DST_LIST[@]}")
for line in "${DST_LIST[@]}"; do
echo "$line"
done
echo "LEN: ${#DST_LIST[@]}"
'-e ssh -p 8888' mark@myhost.com:/dst1
'-e ssh -p 9999' mark2@myhost2.com:/dst2
'-e ssh -p 10000' mark3@myhost3.com:/dst3
---------------------------------
'-e ssh -p 8888' mark@myhost.com:/dst1
'-e ssh -p 10000' mark3@myhost3.com:/dst3
LEN: 2
AA+=( 100 )
declare -A AA
AA+=([hello]=0)
AA+=([world]=1)
versions="2.15/
2.16.0.g/
2.16/
2.17.0.g/
2.18.0.g/"
/
을 버리면서 배열로 하나씩 추가versions_list=($(echo "${versions}" | tr "/" "\n"))
echo "${versions_list[0]}"
------ 출력 -----
2.15
해결 방법
"문자열1 문자열2 ... "
로 다시 quote로 둘러 싼다.$#
: args 갯수$@
: args 전체