나는 다음 스크립트를 작성했습니다
로드 기능은 배열 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
함수를 호출하기 전에.