단일 표현식만 사용하여 명령 출력을 분할하고 그 결과를 배열에 할당하려면 어떻게 해야 합니까?

단일 표현식만 사용하여 명령 출력을 분할하고 그 결과를 배열에 할당하려면 어떻게 해야 합니까?

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

관련 정보