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 shell ( /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

它避免創建任何中間臨時文件,這可能快一點。但是,如果您需要或使用這些中間文件,那麼單行是一個更糟糕的方向。

透過閱讀足夠多的編寫良好的 shell 腳本,我學到的一件事是「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'

除此之外,這組參數確實有助於減少未設定變數所帶來的意外情況。

相關內容