Prática recomendada do script BASH [closed]

1

Acabei de escrever um script bash e funciona como eu queria. Esse é o script:

#!/usr/bin/env bash
DY='date +%Y%m%d'

gunzip -c /var/log/cisco/cisco.log-$DY.gz > file.log
sleep 3
cat file.log | grep "Virtual device ath0 asks to queue packet" > file2.log
awk '{print $4}' file2.log > IP.log
sort IP.log | uniq > devices.log
wc -l devices.log
rm file.log file2.log IP.log devices.log

No entanto, como sou novo em bash , gostaria de perguntar se existe uma maneira melhor de executar esse tipo de script (ainda em bash environment). Quaisquer explicações serão muito úteis para melhorar meu aprendizado.

    
por Federi 04.11.2015 / 15:30

3 respostas

2

Aqui está uma variação do seu script, como um "one-liner":

gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
grep "Virtual device ath0 asks to queue packet" | \
awk '{print $4}' | sort | uniq | wc -l

Evita a criação de arquivos temporários intermediários, que podem ser mais rápidos. Se você tinha alguma necessidade ou uso para esses arquivos intermediários, o one-liner é uma direção pior.

Uma das coisas que aprendi ao ler scripts de shell bem escritos foi que a sequência "grep | awk" geralmente pode ser combinada. Para o seu script, observe que o comando grep foi substituído:

gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
awk '/Virtual device ath0 asks to queue packet/ { print $4 }' | \
sort | uniq | wc -l
    
por 04.11.2015 / 15:47
4
  • Use um cabeçalho comentado explicando o que o script faz e seu uso
  • Use o shell POSIX ( /bin/sh ) para portabilidade, geralmente bash não é necessário para scripts simples
  • Use variáveis em vez de strings codificadas
  • Considere usar a sintaxe $(some_command) em vez de backticks
  • Não use cat em grep , em vez disso, use grep <pattern> <file>
  • Por que o sono?
  • Livre-se das variáveis temporárias, se não precisar dos arquivos, use pipes
  • sort | uniq pode ser substituído por sort -u
  • Se você precisar usar arquivos temporários, considere a limpeza adequada .
por 04.11.2015 / 15:45
0

Recentemente, achei útil usar o modo Unofficial bash strict :

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

Esse conjunto de parâmetros realmente ajuda a reduzir surpresas de variáveis não definidas, entre outras coisas.

    
por 04.11.2015 / 15:41

Tags