수색…


배열 할당

목록 할당

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'

이름 별 할당 (연관 배열)

4.0
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]}"
4.3

하위 문자열 확장 구문을 사용하여 마지막 요소 인쇄

echo "${arr[@]: -1 }"
4.3

첨자 구문을 사용하여 마지막 요소 인쇄

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
3.1

추가

첨자가 지정되지 않으면 요소를 끝에 추가하여 배열을 수정하십시오.

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]

연관 배열

4.0

연관 배열 선언

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
2.04

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
2.04

숫자 조건부 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
2.04

숫자 조건을 가진 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
4.0

mapfile 또는 readarray (동의어) :

mapfile -t arr < file
readarray -t arr < file


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow