Estou fazendo um script para imprimir as informações do sistema de arquivos ZFS - atualmente em fase de teste, e estou recebendo um erro estranho.
A parte relevante do meu script inicial é esta:
zfs_human="$(zfs list | head -n 2 | tail -n 1)"
dfs_human="$(df -h | grep 'zfs' | head -n 1)"
zfs_usedh="$(echo $zfs_human | cut -d ' ' -f2)"
zfs_totah="$(echo $dfs_human | cut -d ' ' -f2)"
echo "$zfs_human"
echo "$dfs_human"
echo "$zfs_usedh"
echo "$zfs_totah"
Dando a seguinte saída:
zfs 2.31M 5.27T 34.4K /mnt/zfs
zfs 5.3T 128K 5.3T 1% /mnt/zfs
2.31M
5.3T
No entanto, quando executo shellcheck
, ele diz que devo colocar aspas duplas nos nomes das variáveis dentro da substituição do comando, esta é a saída de shellcheck
:
In zfsspace.sh line 5:zfs_usedh="$(echo $zfs_human | cut -d ' ' -f2)" ^--------^
SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
zfs_usedh="$(echo "$zfs_human" | cut -d ' ' -f2)"
In zfsspace.sh line 6:zfs_totah="$(echo $dfs_human | cut -d ' ' -f2)" ^--------^
SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
zfs_totah="$(echo "$dfs_human" | cut -d ' ' -f2)"
Então, é claro, mudo meu código para a recomendação do shellcheck:
zfs_human="$(zfs list | head -n 2 | tail -n 1)"
dfs_human="$(df -h | grep 'zfs' | head -n 1)"
zfs_usedh="$(echo "$zfs_human" | cut -d ' ' -f2)"
zfs_totah="$(echo "$dfs_human" | cut -d ' ' -f2)"
echo "$zfs_human"
echo "$dfs_human"
echo "$zfs_usedh"
echo "$zfs_totah"
Mas agora a saída é esta:
zfs 2.31M 5.27T 34.4K /mnt/zfs
zfs 5.3T 128K 5.3T 1% /mnt/zfs
As linhas 3 e 4 estão em branco, o que significa que a substituição do 3º e 4º comando não funciona ao seguir a recomendação do shellcheck, mas funciona quando não estou citando a variável que eu echo.
Estou usando o Bash 5.0.17 no Ubuntu 20.04.1
Alguém pode explicar isso por favor??? Obrigado.
Adicionar
-H
a zfs removerá os cabeçalhos e os campos separados por uma única guia em vez de espaços em branco arbitrários, o que simplifica consideravelmente a análise. Porquedf
não tem uma opção para remover o cabeçalho,findmnt
será uma escolha melhor.Não há tamanho total, pois
df
assim, você precisa recorrer à matemática tradicional.De acordo com a sugestão do @steeldrivers, substituí
cut
porawk
, e isso funciona conforme o esperado.Por consistência, acredito que esta seja a melhor solução para preservar a sintaxe recomendada por
shellcheck
, usando consistentementeawk
overcut
para divisão de strings, a menos que haja um motivo específico para usarcut
.