ler 'df -h' saída como array de linhas no bash

2

Estou tentando ler a saída "df -h" como um array de linhas no shell script.

Eu tentei o código abaixo, mas seu var [0] está me dando a primeira coluna da primeira linha, em vez da primeira linha inteira. Minha expectativa é obter a linha completa em uma iteração.

var=($(df -k))
echo " echo ${var[0]}

Como posso conseguir isso sem usar o awk?

    
por Venkat Teki 01.03.2016 / 12:00

1 resposta

2

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

    
por 01.03.2016 / 12:46

Tags