Mejores prácticas de script BASH

Mejores prácticas de script BASH

Acabo de escribir un bashguión y funciona como quería. Ese es el guión:

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

Sin embargo, como soy nuevo, bashpreguntaría si hay una mejor manera de hacer ese tipo de script (aún en bashel entorno). Cualquier explicación me será de gran utilidad para mejorar mi aprendizaje.

Respuesta1

  • Utilice un encabezado comentado que explique qué hace el script y su uso.
  • Utilice el shell POSIX ( /bin/sh) para portabilidad; a menudo bashno es necesario para scripts simples.
  • Utilice variables en lugar de cadenas codificadas
  • Considere usar la $(some_command)sintaxis en lugar de comillas invertidas.
  • No catte guste grep, en su lugar usagrep <pattern> <file>
  • ¿Por qué dormir?
  • Deshágase de las variables temporales si no necesita los archivos, utilice tuberías en su lugar
  • sort | uniqpuede ser reemplazado porsort -u
  • Si tiene que utilizar archivos temporales, considerelimpiar adecuadamente.

Respuesta2

Aquí hay una variación de su guión, como una "de una sola línea":

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 la creación de archivos temporales intermedios, quepuedese más rápido. Sin embargo, si tuviera alguna necesidad o uso para esos archivos intermedios, la frase de una sola línea es una dirección peor.

Una de las cosas que aprendí al leer suficientes scripts de shell bien escritos fue que la secuencia "grep | awk" a menudo se puede combinar. Para su script, observe que el comando grep ha sido reemplazado:

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

Respuesta3

Recientemente encontré útil usarModo estricto de bash no oficial:

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

Este conjunto de parámetros realmente ayuda a reducir las sorpresas de variables no configuradas, entre otras cosas.

información relacionada