수색…
배열 할당
목록 할당
Perl, C 또는 Java에 익숙하다면 Bash가 쉼표를 사용하여 배열 요소를 구분한다고 생각할 수도 있지만 그렇지 않습니다. 대신 Bash는 공백을 사용합니다.
# Array in Perl
my @array = (1, 2, 3, 4);
# Array in Bash
array=(1 2 3 4)
새 요소를 사용하여 배열을 만듭니다.
array=('first element' 'second element' 'third element')
아래 첨자 할당
명시 적 요소 인덱스를 사용하여 배열을 만듭니다.
array=([3]='fourth element' [4]='fifth element')
인덱스 별 할당
array[0]='first element'
array[1]='second element'
이름 별 할당 (연관 배열)
declare -A array
array[first]='First element'
array[second]='Second element'
동적 할당
seq 를 사용하여 1에서 10까지의 범위를 얻는 등 다른 명령의 출력에서 배열을 만듭니다.
array=(`seq 1 10`)
스크립트의 입력 인수에서 할당 :
array=("$@")
루프 내의 할당 :
while read -r; do
#array+=("$REPLY") # Array append
array[$i]="$REPLY" # Assignment by index
let i++ # Increment index
done < <(seq 1 10) # command substitution
echo ${array[@]} # output: 1 2 3 4 5 6 7 8 9 10
여기서 $REPLY
는 항상 현재 입력입니다.
배열 요소 액세스
인덱스 0의 요소를 표시합니다.
echo "${array[0]}"
하위 문자열 확장 구문을 사용하여 마지막 요소 인쇄
echo "${arr[@]: -1 }"
첨자 구문을 사용하여 마지막 요소 인쇄
echo "${array[-1]}"
각 요소를 따로 따로 인쇄하십시오.
echo "${array[@]}"
모든 요소를 작은 따옴표로 묶은 문자열로 출력하십시오.
echo "${array[*]}"
인덱스 1의 모든 요소를 인쇄합니다 (각각 따로 따로 인용).
echo "${array[@]:1}"
인덱스 1에서 3 개의 요소를 인쇄합니다. 각 요소는 따로 따로 따로 표시됩니다.
echo "${array[@]:1:3}"
문자열 연산
단일 요소를 참조하면 문자열 연산이 허용됩니다.
array=(zero one two)
echo "${array[0]:0:3}" # gives out zer (chars at position 0, 1 and 2 in the string zero)
echo "${array[0]:1:3}" # gives out ero (chars at position 1, 2 and 3 in the string zero)
그래서 ${array[$i]:N:M}
로부터 문자열 밖으로 준다 N
문자열의 위치 일 (0부터)를 ${array[$i]}
와 M
다음 문자.
배열 길이
${#array[@]}
배열 ${array[@]}
의 길이를 나타냅니다.
array=('first element' 'second element' 'third element')
echo "${#array[@]}" # gives out a length of 3
이것은 단일 요소의 문자열에서도 작동합니다.
echo "${#array[0]}" # gives out the lenght of the string at element 0: 13
배열 수정
색인 변경
배열의 특정 요소 초기화 또는 업데이트
array[10]="elevenths element" # because it's starting with 0
추가
첨자가 지정되지 않으면 요소를 끝에 추가하여 배열을 수정하십시오.
array+=('fourth element' 'fifth element')
전체 배열을 새 매개 변수 목록으로 바꾸십시오.
array=("${array[@]}" "fourth element" "fifth element")
처음에 요소를 추가하십시오.
array=("new element" "${array[@]}")
끼워 넣다
주어진 색인에 요소를 삽입하십시오 :
arr=(a b c d)
# insert an element at index 2
i=2
arr=("${arr[@]:0:$i}" 'new' "${arr[@]:$i}")
echo "${arr[2]}" #output: new
지우다
unset
내장을 사용하여 배열 색인을 삭제합니다.
arr=(a b c)
echo "${arr[@]}" # outputs: a b c
echo "${!arr[@]}" # outputs: 0 1 2
unset -v 'arr[1]'
echo "${arr[@]}" # outputs: a c
echo "${!arr[@]}" # outputs: 0 2
병합
array3=("${array1[@]}" "${array2[@]}")
이것은 희소 배열에도 적용됩니다.
배열 다시 색인하기
요소가 배열에서 제거되었거나 배열에 간격이 있는지 확실하지 않은 경우 유용 할 수 있습니다. 틈이없는 인덱스를 다시 만들려면 :
array=("${array[@]}")
배열 반복
배열 반복은 foreach와 고전적인 for 루프의 두 가지 형태로 제공됩니다.
a=(1 2 3 4)
# foreach loop
for y in "${a[@]}"; do
# act on $y
echo "$y"
done
# classic for-loop
for ((idx=0; idx < ${#a[@]}; ++idx)); do
# act on ${a[$idx]}
echo "${a[$idx]}"
done
명령 출력을 반복 할 수도 있습니다.
a=($(tr ',' ' ' <<<"a,b,c,d")) # tr can transform one character to another
for y in "${a[@]}"; do
echo "$y"
done
배열 삭제, 삭제 또는 설정 해제
배열을 삭제, 삭제 또는 설정 해제하려면 :
unset array
단일 배열 요소를 파괴, 삭제 또는 설정 해제하려면 :
unset array[10]
연관 배열
연관 배열 선언
declare -A aa
초기화 또는 사용 전에 연관 배열 선언은 필수입니다.
요소 초기화
다음과 같이 요소를 한 번에 하나씩 초기화 할 수 있습니다.
aa[hello]=world
aa[ab]=cd
aa["key with space"]="hello world"
또한 하나의 명령문에서 전체 연관 배열을 초기화 할 수 있습니다.
aa=([hello]=world [ab]=cd ["key with space"]="hello world")
연관 배열 요소에 액세스
echo ${aa[hello]}
# Out: world
연관 배열 키 나열
echo "${!aa[@]}"
#Out: hello ab key with space
연관 배열 값 나열
echo "${aa[@]}"
#Out: world cd hello world
연관 배열 키와 값에 대해 반복 수행
for key in "${!aa[@]}"; do
echo "Key: ${key}"
echo "Value: ${array[$key]}"
done
# Out:
# Key: hello
# Value: world
# Key: ab
# Value: cd
# Key: key with space
# Value: hello world
연관 배열 요소 수 계산
echo "${#aa[@]}"
# Out: 3
초기화 된 인덱스 목록
배열에서 초기화 된 색인 목록 가져 오기
$ arr[2]='second'
$ arr[10]='tenth'
$ arr[25]='twenty five'
$ echo ${!arr[@]}
2 10 25
배열을 통해 루핑하기
예제 배열 :
arr=(a b c d e f)
for..in
루프 사용 :
for i in "${arr[@]}"; do
echo "$i"
done
C 스타일 for
루프 사용 :
for ((i=0;i<${#arr[@]};i++)); do
echo "${arr[$i]}"
done
while
루프 사용 :
i=0
while [ $i -lt ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
숫자 조건부 while
루프 사용 :
i=0
while (( $i < ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
until
루프 사용 :
i=0
until [ $i -ge ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
숫자 조건을 가진 until
루프 사용하기 :
i=0
until (( $i >= ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
문자열에서 배열
stringVar="Apple Orange Banana Mango"
arrayVar=(${stringVar// / })
문자열의 각 공백은 결과 배열의 새 항목을 나타냅니다.
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[3]} # will print Mango
마찬가지로 다른 문자도 구분 문자로 사용할 수 있습니다.
stringVar="Apple+Orange+Banana+Mango"
arrayVar=(${stringVar//+/ })
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[2]} # will print Banana
배열 삽입 함수
이 함수는 주어진 인덱스의 배열에 요소를 삽입합니다 :
insert(){
h='
################## insert ########################
# Usage:
# insert arr_name index element
#
# Parameters:
# arr_name : Name of the array variable
# index : Index to insert at
# element : Element to insert
##################################################
'
[[ $1 = -h ]] && { echo "$h" >/dev/stderr; return 1; }
declare -n __arr__=$1 # reference to the array variable
i=$2 # index to insert at
el="$3" # element to insert
# handle errors
[[ ! "$i" =~ ^[0-9]+$ ]] && { echo "E: insert: index must be a valid integer" >/dev/stderr; return 1; }
(( $1 < 0 )) && { echo "E: insert: index can not be negative" >/dev/stderr; return 1; }
# Now insert $el at $i
__arr__=("${__arr__[@]:0:$i}" "$el" "${__arr__[@]:$i}")
}
용법:
insert array_variable_name index element
예:
arr=(a b c d)
echo "${arr[2]}" # output: c
# Now call the insert function and pass the array variable name,
# index to insert at
# and the element to insert
insert arr 2 'New Element'
# 'New Element' was inserted at index 2 in arr, now print them
echo "${arr[2]}" # output: New Element
echo "${arr[3]}" # output: c
전체 파일을 배열로 읽어 들이기
단일 단계로 읽기 :
IFS=$'\n' read -r -a arr < file
루프에서 읽기 :
arr=()
while IFS= read -r line; do
arr+=("$line")
done
mapfile
또는 readarray
(동의어) :
mapfile -t arr < file
readarray -t arr < file