탭으로 구분된 항목을 readarray에 전달

탭으로 구분된 항목을 readarray에 전달

분명히 제대로 하고 있지는 않지만 예상되는 결과는 분명하다고 생각합니다( ${#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옵션을 사용하여 배열 요소에서 구분 기호를 제거 할 수도 있습니다 .

관련 정보