$(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.