쉘 스크립트에서 "df -h" 출력을 행 배열로 읽으려고 합니다.
아래 코드를 시도했지만 var[0]은 첫 번째 행 전체가 아닌 첫 번째 행의 첫 번째 열을 제공합니다. 내 기대는 한 번의 반복으로 완전한 라인을 얻는 것입니다.
var=($(df -k))
echo " echo ${var[0]}
awk를 사용하지 않고 이를 달성하는 방법은 무엇입니까?
답변1
$(cmd)
(명령 대체) 목록 컨텍스트에서 인용을 해제하면 POSIX 셸에서 분할+glob 연산자가 호출됩니다 bash
. 예를 들어 여기서는 glob 부분이 필요하지 않습니다. 분할 부분은 $IFS
(기본적으로 공백, 탭 및 줄 바꿈)에 있는 문자를 기준으로 분할됩니다.
여기에서 원하는 것은 다음과 같습니다.
IFS='
' # split on newline only. Also IFS=$'\n' in bash/ksh93/zsh/mksh
set -o noglob # disable globbing
lines=($(df -k)) # use the split+glob operator
(빈 줄이 제거됩니다.)
mksh
이는 , 또는 ( 생략 가능 yash
) 에서도 작동합니다 . zsh는 명령 대체 시 글로빙이 아닌 분할만 수행하기 때문입니다.ksh93
zsh
zsh
set -o noglob
또는 다음을 수행할 수 있습니다(bash에만 해당).
readarray -t lines < <(df -k)
출력에 항목당 정확히 한 줄이 포함될 것이라는 보장은 없습니다 df
.텍스트 처리를 위해 쉘 루프를 사용하는 것은 일반적으로 올바른 접근 방식이 아닙니다.. 또한 bash 및 ksh의 배열 인덱스는 0에서 시작하지만 다른 모든 쉘에서는 1에서 시작합니다.