다음과 같은 쉘 코드가 있습니다.
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' "$@"
}