배열 변수는 언제 전체 배열을 나타내고 언제 "0"으로 인덱스된 요소를 나타내나요?

배열 변수는 언제 전체 배열을 나타내고 언제 "0"으로 인덱스된 요소를 나타내나요?

Bash 매뉴얼은 다음과 같이 말합니다:

아래 첨자가 없는 배열 변수를 참조하는 것은 아래 첨자 0이 있는 배열 변수를 참조하는 것과 같습니다.

0Bash 또는 POSIX 셸에는 배열 변수가 전체 배열을 나타내는 경우와 ? 로 인덱스된 요소를 나타내는 경우에 대한 몇 가지 일반적인 규칙이 있습니다.

예를 들어,

  1. declare배열 변수는 전체 배열을 나타내는 것처럼 보이지만 매개변수 확장에서는 index 의 요소를 나타냅니다 0.

    $ declare -p x
    declare -a x='([1]="b" [2]="c")'
    $ echo $x
    
  2. 에서는 배열을 의미합니까, [[ -v myarr ]]아니면 ?myarrmyarr[0]

답변1

나는 당신의 혼란이 단어에 있다고 생각합니다"인용하다."

당신은하지 않습니다인용하다배열 변수는 결국 declare이름을 부여한 것 입니다 x.

변수를 참조하려면 $이름 앞에 와야 합니다.

bash 매뉴얼 페이지에서 모든 인스턴스를 검색 referenc하고 읽어보세요.


두 번째 질문은 다음과 같습니다.

에서는 배열을 의미합니까, [[ -v myarr ]]아니면 ?myarrmyarr[0]

테스트를 통과했다는 것은 myarr[0].

$ declare -p myarr
bash: declare: myarr: not found
$ myarr=()
$ declare -p myarr
declare -a myarr='()'
$ echo $myarr

$ [[ -v myarr ]] && echo is set
$ [[ -v myarr[0] ]] && echo is set
$ [[ -v myarr[1] ]] && echo is set
$ myarr+=([1]=b)
$ declare -p myarr
declare -a myarr='([1]="b")'
$ echo $myarr

$ [[ -v myarr ]] && echo is set
$ [[ -v myarr[0] ]] && echo is set
$ [[ -v myarr[1] ]] && echo is set
is set
$ myarr+=([0]=q)
$ declare -p myarr
declare -a myarr='([0]="q" [1]="b")'
$ echo $myarr
q
$ [[ -v myarr ]] && echo is set
is set
$ [[ -v myarr[0] ]] && echo is set
is set
$ [[ -v myarr[1] ]] && echo is set
is set
$ 

답변2

변수를 "변수 이름"을 나타내는 문자열과 혼합합니다.

A는 $variable변수이며 variable일부 명령에 의해 변수로 해석되는 문자열입니다.

이 시도:

$ a=x
$ x=(111 222 333)
$ declare -p $a
declare -a x='([0]="111" [1]="222" [2]="333")'

변수 a( )의 확장은 $astring 을 제공하며 x, 이는 "변수 이름"으로 해석되어 선언된 후 확장되어 인쇄됩니다.

또한 테스트에서는 [[ -v myarr ]]문자열을 myarr변수로 해석하므로 항상 전체 변수입니다.

노력하다

$ a=myarr
$ unset myarr
$ [[ -v $a ]] && echo set || echo unset
unset

$ myarr[5]=five
$ [[ -v $a ]] && echo set || echo unset
set

관련 정보