Лучшая практика скрипта BASH

Лучшая практика скрипта BASH

Я только что написал bashскрипт, и он работает так, как я хотел. Вот скрипт:

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

Однако, поскольку я новичок, bashя хотел бы спросить, есть ли лучший способ сделать такой сценарий (все еще в bashсреде). Любые объяснения будут очень полезны для улучшения моего обучения.

решение1

  • Используйте прокомментированный заголовок, поясняющий, что делает скрипт и как он используется.
  • Используйте оболочку POSIX ( /bin/sh) для переносимости, часто bashне требуется для простых скриптов
  • Используйте переменные вместо жестко закодированных строк
  • Рассмотрите возможность использования $(some_command)синтаксиса вместо обратных кавычек
  • Не catвключайте grep, вместо этого используйтеgrep <pattern> <file>
  • Почему сон?
  • Избавьтесь от временных переменных, если вам не нужны файлы, используйте вместо них каналы.
  • sort | uniqможно заменить наsort -u
  • Если вам приходится использовать временные файлы, рассмотритеубирать правильно.

решение2

Вот вариант вашего сценария, в виде «однострочного»:

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

Он позволяет избежать создания промежуточных временных файлов, которыеможетбыть быстрее. Если у вас есть какая-либо потребность или использование этих промежуточных файлов, однострочник — худшее направление.

Одна из вещей, которую я узнал, прочитав достаточно хорошо написанные скрипты оболочки, заключалась в том, что последовательность "grep | awk" часто можно комбинировать. Обратите внимание, что для вашего скрипта команда grep была заменена:

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

решение3

Недавно я обнаружил, что полезно использоватьНеофициальный строгий режим bash:

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

Этот набор параметров действительно помогает, помимо прочего, уменьшить количество сюрпризов, связанных с неустановленными переменными.

Связанный контент