Bash에서 문자열 배열을 사용하는 방법

Bash에서 문자열 배열을 사용하는 방법

나는 다음 스크립트를 작성했습니다

로드 기능은 배열 disk[a]=1등을 설정해야 합니다.disk[b]=2

그런 다음 out 함수는 배열을 인쇄해야 합니다 ${disk[a]}.${disk[b]}

하지만 함수 출력에서 ​​얻는 것은 항상 숫자입니다.4

대신 다음을 얻고 싶습니다.

1
2
3
4

여기서 무슨 문제가 있습니까?

함수 출력이 인쇄되도록 수정하는 방법:

1
2
3
4

스크립트:

#!/bin/bash

function load
{
  counter=1
  for input in a b c d
  do
    disk[$input]=$counter
    let counter=$counter+1
    echo ${disk[$input]}
  done
}


function out
{
  counter=1
  for input in  a b c d
  do
    echo ${disk[$input]}
    let counter=$counter+1
  done
}

echo "run function load"
load
echo "run function out"
out

산출:

./test
run function load
1
2
3
4
run function out
4
4
4
4

답변1

배열을 초기화하면 어떤 일이 일어나는지 확인하세요.

$ i=0; for k in a b c d; do A[$k]=$((i++)); done; declare -p A
declare -a A=([0]="3")

요소가 하나만 존재하며 해당 인덱스는 0입니다.

기본적으로 배열은 인덱싱됩니다.숫자로, 사용하는 인덱스 값은 모두 0입니다. 실제로 산술적 맥락에서는 일반 배열 첨자와 마찬가지로 문자열이 변수 이름으로 처리되고 해당 변수의 값이 사용됩니다. 따라서 a, ...을 숫자로 설정하면 b다른 결과가 나타납니다.

$ a=123; b=456; c=789; d=999; i=0;
$ for k in a b c d; do A[$k]=$((i++)); done;
$ declare -p A
declare -a A=([123]="0" [456]="1" [789]="2" [999]="3")

declare -A arrayname실제로 문자열 자체를 인덱스로 사용하려면 먼저 또는 다음을 사용하여 배열을 연관 배열로 선언하세요 typeset -A arrayname.

$ unset A; declare -A A; i=0;
$ for k in a b c d; do A[$k]=$((i++)); done; declare -p A
declare -A A=([a]="0" [b]="1" [c]="2" [d]="3" )

답변2

Bash 배열은인덱스 배열기본적으로:

구문을 사용하여 변수를 할당하면 인덱스 배열이 자동으로 생성됩니다.name[subscript]=value

...하지만 문자를 인덱스로 사용하고 있으므로 연관 배열이 필요할 수 있습니다. 즉, 다음이 필요합니다.

declare -A disk

함수를 호출하기 전에.

관련 정보