
알아채다:비슷한 질문에 대한 다른 답변을 읽었습니다.출력을 분할하여 배열에 저장하는 방법은 무엇입니까?,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[@]}"