0 byte arquivo criado em um script simples

1

Eu tenho um script como abaixo:

#!/bin/bash
df -k | tr -s " " "," | awk 'BEGIN {FS=","} {print $1,$5}'|sed 1d > file1.txt
while read partition percentUsed
do
if [ $percentUsed > 75 ]
then
echo Partition: ${partition} space is ${percentUsed}
else
echo Pration: $partition: OK!!
fi
done < file1.txt

O script está sendo executado corretamente, no entanto, está criando um arquivo de zero byte com o nome 75. Tem alguma idéia do porquê isso está acontecendo?

$ sh diskUsed.sh
Partition: C:/Users/Public/Documents/CYGWIN/bin space is 75%
Partition: C:/Users/Public/Documents/CYGWIN/lib space is 75%
Partition: C:/Users/Public/Documents/CYGWIN space is 75%
Partition: C: space is 75%
Partition: H: space is 91%


$ ls -lrt
total 2
-rwxrwxrwx 1 diwvibh Domain Users 284 Nov 21 04:17 diskUsed.sh
-rw-r--r-- 1 diwvibh Domain Users 133 Nov 21 04:29 file1.txt
-rw-r--r-- 1 diwvibh Domain Users   0 Nov 21 04:29 75
    
por user80040 21.11.2014 / 10:33

3 respostas

2

 if [ $percentUsed > 75 ]

Você deve usar o operador -gt para comparações numéricas; o que você está fazendo é salvar a saída (vazia) do comando " [$ percentUsed] " em um arquivo chamado "75".

The script is executing properly, however, it is creating a zero byte file by the name 75. Any ideas why this is happening?

Não está sendo executado corretamente. O comando " [$ percentUsed] " retorna true se a string não estiver vazia, o que sempre é para este script, então sempre assume a primeira ramificação do se afirmação.

Como $ percentUsed não é um número inteiro (ele tem um '%' final) pode usar $ {percentUsed% [%]} para remover o '%' final da variável, ou adicione zero dentro do awk, como sugere o @val0x00ff.

Comentários gerais para scripts do bash:

  1. Favor [[<>> expr ]] ao invés de [<>> expr ], pois é mais poderoso e manipula melhor as strings vazias.
  2. Use aspas duplas em torno de strings, a menos que você tenha motivos para não fazê-lo, por exemplo: livrar-se de novas linhas.
  3. Adicione chaves: $ {var} em vez de $ var - muitas vezes pode eliminar a confusão ao ler e permite que as variáveis entrem no texto, como: echo "Restante: $ {kb} KB"
  4. Geralmente, evite criar arquivos temporários quando possível. Use pipes entre os estágios.
  5. Se você estiver usando uma ferramenta (como o awk ), aprenda a usar seu poder, ela tornará seu código mais conciso e facilitará a leitura do código dos outros.
  6. Recue seu código corretamente (o que talvez você tenha feito na realidade, mas não no post).
  7. Se você pretende digitar pontos de exclamação ("!"), use set + H para que eles não estraguem a sua interativa bash inserindo o histórico.

Aqui está uma versão funcional do seu script:

#!/bin/bash +H
df -k | awk '(FNR>1){print $1,$5+0}' | while read partition percentUsed
do
    if [[ $percentUsed -gt 75 ]]
    then
        echo "Partition: ${partition} space is ${percentUsed}% used"
    else
        echo "Partition: ${partition}: OK!!"
    fi
done

Nit pick: sua linha "echo" produziria "Partition / home space é 80" se fosse 80% usada, muitos leriam "space" como " free space", o que seria 20 %.

    
por 21.11.2014 / 16:58
2

Na linha 5, você escreve o conteúdo de $ percentUsed no arquivo "75". Em vez disso, tente if [ ''echo $percentUsed | sed 's/%//''' -gt 75 ] , que deve fazer o que você deseja. Pelo menos com o bash 4.2.25 no Linux funciona. Nota: Por favor, use apenas um backtick em vez de dois mostrados aqui - isso porque a plataforma web Stackexchange interpreta esses backticks.

    
por 21.11.2014 / 10:43
0

Esta é uma maneira eficiente de calcular o espaço em disco. Neste exemplo, estou usando o /home dir.

#!/bin/bash

 { read -r; read -rd '' -a disk_usage; } < <(LC_ALL=C df -Pk "/home"; printf \0)
    percent=$(echo "${disk_usage[4]}" | awk '{print $0+0}')
    if (( percent > 75 )); then echo "Disk is critical"; else echo "Disk space is OK"; fi

Como uma nota lateral, o comando que você tem lá que é

df -k | tr -s " " "," | awk 'BEGIN {FS=","} {print $1,$5}'|sed 1d

É muito ineficiente, pois ele cria muitos processos como tr , awk , sed . Você pode fazer isso de uma só vez. Remova o +0 no final, se você quiser ver o sinal % .

df -k | awk 'NR>1{print $1,$(NF-1)+0}'

Espero que ajude!

    
por 21.11.2014 / 10:58

Tags