"readarray"로 구성된 배열 요소가 큰따옴표로 묶여 있을 때 가상의 "\n"을 얻는 이유는 무엇입니까?

"readarray"로 구성된 배열 요소가 큰따옴표로 묶여 있을 때 가상의 "\n"을 얻는 이유는 무엇입니까?

readarray나는 근본 원인을 알 수 없는 행동을 발견했습니다 .

아래 코드:

readarray array < <(echo -e "Jenny\nJane\nJessica")

echo "* Not enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
    echo ${array[$i]}
done

echo "* Enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
    echo "${array[$i]}"
done

다음과 같은 출력이 생성됩니다.

* Not enclosed:
Jenny
Jane
Jessica
* Enclosed:
Jenny

Jane

Jessica

" "요소가 이렇게 둘러싸이면 왜 간격이 벌어지나요? 변수를 다음과 같이 바꾸
더라도 :echo "${array[$i]}"

foo=${array[$i]}
echo "$foo"

출력은 여전히 ​​간격을 두고 있습니다.
그러나 일반적인 방법으로 배열을 선언하면 array=("Jenny" "Jane "Jessica")따옴표에 관계없이 공백이 삽입되지 않습니다.

이것이 문제를 일으키는 이유는 배열을 반복하면서 문장에서 요소를 가져와서 에코해야 하기 때문입니다. 예를 들어:

readarray array < <(echo -e "Jenny\nJane\nJessica")
for ((i=0; i<${#array[@]}; i++)); do
    echo "Hello, ${array[$i]}!"
done

그러나 ${array[$i]}그 사이에 무언가가 " "삽입 \n되고 출력은 다음과 같습니다.

Hello, Jenny
!
Hello, Jane
!
Hello, Jessica
!

답변1

-t이는 readarray가 이 옵션으로 호출 되지 않는 한 구분 기호(기본적으로 개행 문자)를 제거하지 않기 때문입니다 .

배열 값을 인쇄하는 더 간단한 declare -p var방법은 다음을 살펴보십시오.

$ readarray array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]=$'Jenny\n' [1]=$'Jane\n' [2]=$'Jessica\n')

각 요소의 후행 개행 문자를 볼 수 있습니다.

비록 이것이:

$ readarray -t array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]="Jenny" [1]="Jane" [2]="Jessica")

후행 개행 문자가 없습니다.

따옴표 없이 변수 확장을 사용하는 것은 나쁜 생각입니다. 하지 마세요.

관련 정보