Bash에서 "df -h" 출력을 행 배열로 읽습니다.

Bash에서 "df -h" 출력을 행 배열로 읽습니다.

쉘 스크립트에서 "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는 명령 대체 시 글로빙이 아닌 분할만 수행하기 때문입니다.ksh93zshzshset -o noglob

또는 다음을 수행할 수 있습니다(bash에만 해당).

readarray -t lines < <(df -k)

출력에 항목당 정확히 한 줄이 포함될 것이라는 보장은 없습니다 df.텍스트 처리를 위해 쉘 루프를 사용하는 것은 일반적으로 올바른 접근 방식이 아닙니다.. 또한 bash 및 ksh의 배열 인덱스는 0에서 시작하지만 다른 모든 쉘에서는 1에서 시작합니다.

관련 정보