![단일 표현식만 사용하여 명령 출력을 분할하고 그 결과를 배열에 할당하려면 어떻게 해야 합니까?](https://linux55.com/image/109798/%EB%8B%A8%EC%9D%BC%20%ED%91%9C%ED%98%84%EC%8B%9D%EB%A7%8C%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%AA%85%EB%A0%B9%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EB%B6%84%ED%95%A0%ED%95%98%EA%B3%A0%20%EA%B7%B8%20%EA%B2%B0%EA%B3%BC%EB%A5%BC%20%EB%B0%B0%EC%97%B4%EC%97%90%20%ED%95%A0%EB%8B%B9%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
알아채다:비슷한 질문에 대한 다른 답변을 읽었습니다.출력을 분할하여 배열에 저장하는 방법은 무엇입니까?,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[@]}"