참고:다른 유사한 질문에 대한 답변을 읽었습니다(출력을 분할하여 배열에 저장하는 방법은 무엇입니까?,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
답변3
IFS=" "; set -f
a=( $(echo -e "a b\tc d") )
printf '<%s>\n' "size=${#a[@]}" "${a[@]}"