for 루프의 출력을 변수에 저장하는 방법

for 루프의 출력을 변수에 저장하는 방법

다음과 같은 쉘 코드가 있습니다.

for value in 10 5 27 33 14  25
do
      echo  $value
done

하지만 나중에 출력을 조작하고 싶다면 어떻게 해야 할까요? 전체 출력을 변수에 저장하고 싶습니다. 가능합니까?

답변1

for루핑은 다른 명령과 다르지 않습니다. 명령 대체를 사용할 수 있습니다.

variable=$(
  for value in 10 5 27 33 14  25
  do
    echo "$value"
  done
)

전체 출력에서 ​​마지막으로 추가된 개행 문자를 뺀 문자열을 echo스칼라 $variable변수에 저장합니다.

그러면 다음과 같이 할 수 있습니다:

printf '%s\n' "$variable" | further-processing

또는:

futher-processing << EOF
$variable
EOF

셸 에서는 bash다음을 사용하여 각 출력 줄을 배열 요소에 저장할 수도 있습니다.

readarray -t array < <(
  for value in 10 5 27 33 14  25
  do
    echo "$value"
  done
)

각 공백/탭/줄바꿈을 구분하여 저장합니다.단어(기본값 가정 $IFS) 배열로 출력하려면 Split+glob 연산자를 사용하고 glob 부분을 비활성화할 수 있습니다.

set -o noglob # not needed in zsh which does only split upon unquoted
              # command substitution. zsh also splits on NULs by default
              # whilst other shells either removes them or choke on them.
array=(
  $(
    for value in 10 5 27 33 14  25
    do
      echo "$value"
    done
  )
)

zsh//를 사용하면 다음을 수행할 수도 있습니다 bash.ksh93

array=()
for value in 10 5 27 33 14 25
do
  array+=( "$(cmd "$value")" )
done

어레이를 구축합니다.

그런 다음 그들 모두에서 다음을 수행합니다.

further-processing "${array[@]}"

배열의 모든 요소를 futher-processing​​or에 대한 인수로 전달하려면 다음을 수행하십시오.

printf '%s\n' "${array[@]}" | further-processing

한 줄의 각 요소를 인쇄하려면 다음으로 파이프하세요.further-processing

그러나 배열이 비어 있으면 빈 줄이 계속 인쇄됩니다. Bourne과 유사한 쉘에서 함수를 정의하는 대신 다음을 사용하면 이를 방지할 수 있습니다. 예를 들면 다음 과 print -rC1 --같습니다 .printf '%s\n'zsh

println() {
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}

관련 정보