명령의 출력을 분할하고 단일 표현식만 사용하여 결과를 배열에 할당하는 방법은 무엇입니까?

명령의 출력을 분할하고 단일 표현식만 사용하여 결과를 배열에 할당하는 방법은 무엇입니까?

참고:다른 유사한 질문에 대한 답변을 읽었습니다(출력을 분할하여 배열에 저장하는 방법은 무엇입니까?,Bash에서 문자열을 배열로 분할하는 방법), 그러나 그들 중 누구도 내가 여기서 묻는 특정 질문에 대답하지 않습니다.


일부 명령의 출력이 foo탭으로 구분된 10개의 필드로 구성된 단일 행이라고 가정합니다. 그 다음에

tmpvar=$( foo )
fields=( ${(ps:\t:)tmpvar} )
echo $#fields
# 10

큐:foo에 중간 할당 없이 탭에서 의 출력을 동일하게 분할하려면 어떻게 해야 합니까 tmpvar?


FWIW, 이것은 작동하지 않습니다.

fields=( ${(ps:\t:)$( foo )} )
echo $#fields
# 1

답변1

$ printf '<%s>\n' "${(@ps:\t:)$(printf 'foo bar\t\tbaz')}"
<foo bar>
<>
<baz>

또는 tempvar 접근 방식처럼 빈 요소를 억제하려는 경우:

$ printf '<%s>\n' ${(ps:\t:)"$(printf 'foo bar\t\tbaz')"}
<foo bar>
<baz>

IOW, 명령 대체를 인용해야 합니다. 그렇지 않으면 명령 대체 분할 의 결과로 필드 s:\t:결합(의 첫 번째 문자 사용)에 적용됩니다 .$IFS$IFS

또는 $IFS빈 문자열이나 공백이 아닌 단일 문자로 설정할 수 있습니다.

$ (IFS=; printf '<%s>\n' ${(ps:\t:)$(printf 'foo bar\t\tbaz')})
<foo bar>
<baz>

답변2

$( foo )를 인용해야 합니다.

fields=( ${(ps:\t:)"$( foo )"} )
echo $#fields

당신은 찾을 수 있습니다여기 몇 가지 좋은 예가 있습니다

답변3

IFS=" "; set -f
a=( $(echo -e "a b\tc d") )
printf '<%s>\n' "size=${#a[@]}" "${a[@]}"

관련 정보