Prática recomendada de script BASH

Prática recomendada de script BASH

Acabei de escrever um bashscript e funciona como eu queria. Esse é o roteiro:

#!/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

Porém, por ser novo, bashgostaria de perguntar se existe uma maneira melhor de fazer esse tipo de script (ainda em bashambiente). Qualquer explicação será muito útil para melhorar meu aprendizado.

Responder1

  • Use um cabeçalho comentado explicando o que o script faz e seu uso
  • Use o shell POSIX ( /bin/sh) para portabilidade, muitas vezes bashnão é necessário para scripts simples
  • Use variáveis ​​em vez de strings codificadas
  • Considere usar a $(some_command)sintaxe em vez de crases
  • Não catentre grep, em vez disso usegrep <pattern> <file>
  • Por que o sono?
  • Livre-se das variáveis ​​temporárias se você não precisar dos arquivos, use pipes
  • sort | uniqpode ser substituído porsort -u
  • Se você tiver que usar arquivos temporários, considerelimpando corretamente.

Responder2

Aqui está uma variação do seu script, como uma "linha única":

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, quepoderiaseja mais rápido. Porém, se você tiver alguma necessidade ou uso desses arquivos intermediários, a linha única é uma direção pior.

Uma das coisas que aprendi lendo scripts de shell bem escritos foi que a sequência "grep | awk" pode frequentemente 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

Responder3

Recentemente descobri que é útil usarModo estrito não oficial do bash:

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

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

informação relacionada