배열 선언: 큰따옴표 및 대괄호

배열 선언: 큰따옴표 및 대괄호

어쩌면 이것은 어리석은 질문일지도 모르지만, 2시간 동안 인터넷 검색을 해도 의미 있는 결과가 나오지 않았습니다.

간단히 말해서 Bash에는 다음과 같은 차이점이 있습니다.

X="
a
b
c
"

그리고

X=(
a
b
c
)

전자는 변수의 정의를 따르고 후자는 배열의 정의를 따릅니다.

배열은 다중 요소 변수이므로 전자도 모든 목적에 대한 배열이라는 의미입니까?

전자가 배열인 경우 (a) 큰따옴표와 (b) 대괄호 사이의 유일한 작동상의 차이점은 배열 요소에 대한 인용 규칙의 작동입니까?

어떤 통찰력이라도 주셔서 대단히 감사합니다.

답변1

아니요, 전자는 배열이 아닙니다.

예를 들어 인덱스를 사용하여 멤버를 선택할 수 없습니다.

arr=(a b c)
echo "${arr[1]}"  # b

배열을 사용하여 매개변수를 전달할 수 있지만 문자열은 전달할 수 없습니다. 더 나은 결과를 얻으려면 공백이 포함된 요소를 사용하세요.

arr=(a 'b c' d)
printf '(%s)\n' "${arr[@]}"

string=$'\nm\nn o\np\n'
printf '(%s)\n' $string

산출:

(a)
(b c)
(d)
(m)
(n)
(o)
(p)

man bash두 가지 변수 유형에 대한 설명이 포함되어 있으며 인터넷 검색이 필요하지 않습니다.

답변2

개행으로 구분된 부분 문자열로 구성된 문자열은 문자열 배열과 동일하지 않습니다. 하나는 문자열이고 다른 하나는 문자열을 포함합니다.

문자열에 개행 문자를 포함하여 문자열을 여러 줄로 나눈다는 사실은 문자열 저장에 특별한 의미가 없습니다. 쉘은 라인에서 이를 인덱싱할 수 없으며 단일 라인은 어떤 방식으로든 인코딩하지 않고 삽입된 개행 문자를 포함할 수 없습니다.

배열은 개별 문자열의 순서가 지정된 집합입니다. 각 문자열은 배열의 인덱스를 통해 즉시 액세스할 수 있습니다. 단일 배열 요소에는 줄 바꿈이나 기타 구분 문자가 있거나 없는 표준 문자열이 포함될 수 있습니다(shell의 nul 문자 제외 bash). 그러나 bash다차원 배열은 지원되지 않으므로 배열 요소는 다른 배열이 될 수 없습니다 .

string1='Hello World'

string2="'Twas brillig, and the slithy toves
      Did gyre and gimble in the wabe:
All mimsy were the borogoves,
      And the mome raths outgrabe."

array=( "$string1" "$string2" )

printf '%s\n' "${array[1]}"

위의 스크립트 조각은 Lewis Carroll의 시 "Jabberwocky"의 첫 번째 구절을 인쇄합니다. Hello World배열의 첫 번째 요소가 아닌 두 번째 요소를 출력하도록 선택했기 때문에 인쇄되지 않습니다 . 두 번째 요소는 단일 문자열입니다. 이러한 문자 중 일부는 개행 문자와 공백 문자이지만 이는 단지 데모용일 뿐입니다.

두 번째 배열 요소의 시에서 단 한 줄이나 다른 하위 문자열을 출력하려면 문자열을 구문 분석하는 유틸리티를 사용해야 합니다. 문자열에서 개행으로 구분된 단일 하위 문자열을 추출하는 것은 셸의 배열 개념과 아무 관련이 없습니다.

관련 정보