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")
후행 개행 문자가 없습니다.
따옴표 없이 변수 확장을 사용하는 것은 나쁜 생각입니다. 하지 마세요.