$(cmd) (substituição de comando) deixado sem aspas no contexto de lista invoca o operador split + glob em shells POSIX como bash . Aqui, você não quer a parte glob. A parte dividida divide os caracteres encontrados em $IFS (espaço, tabulação e nova linha por padrão).
Então, aqui, você quer:
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
(note que remove linhas vazias).
Isso também funciona com mksh , yash , ksh93 ou zsh (com zsh , você pode omitir o set -o noglob , já que o zsh só divide, não libera a substituição do comando).
Alternativamente, você poderia fazer (bash específico):
readarray -t lines < <(df -k)
Observe que não há garantia de que haverá uma linha por entrada na saída de df e que o processamento de texto com loops de concha geralmente não é o caminho a seguir . Observe também que, enquanto os índices de array começam em 0 no bash e ksh, eles começam em 1 em todos os outros shells.