분명히 제대로 하고 있지는 않지만 예상되는 결과는 분명하다고 생각합니다( ${#arr[@]}
=3)
$ readarray -d "\t" arr < <(printf "%s\t%s\t%s" "x" "y" "z"); echo "${#arr[@]}"
> 1
답변1
\t
쉘은 이것이 탭이어야 한다는 것을 모릅니다 . \
리터럴 다음에 a가 오는 것을 찾습니다 t
(구분 기호는 단일 바이트(문자도 아님)만 될 수 있으므로 후자는 무시함):
$ readarray -d "\t" arr < <(printf %s 'x\ty\tz'); echo "${#arr[@]}"
3
$ typeset -p arr
declare -a arr=([0]="x\\" [1]="ty\\" [2]="tz")
실제 탭의 경우 다음과 같이 이스케이프해야 합니다.
$ readarray -d $'\t' arr < <(printf "%s\t%s\t%s" "x" "y" "z"); echo "${#arr[@]}"
3
위의 세 번째 값은 분리되지 않습니다. 여기서는 비어 있지 않기 때문에 괜찮지만 비어 있으면 다음과 같은 결과를 얻게 됩니다.
$ readarray -d $'\t' arr < <(printf "%s\t%s\t%s" "x" "y" ""); echo "${#arr[@]}"
2
Null 값을 포함하여 모든 값(TAB 또는 NUL 문자를 포함하지 않음)을 허용하려면 해당 값이 다음으로 구분되어 있는지 확인해야 합니다.
printf '%s\t' "$val1" "$val2" "$val3"
그것은 다음과 같습니다:
printf '%s\t%s\t%s\t' "$val1" "$val2" "$val3"
readarray
의 -t
옵션을 사용하여 배열 요소에서 구분 기호를 제거 할 수도 있습니다 .