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

  • コメント付きのタイトルを使用して、スクリプトの機能と使用方法を説明します。
  • /bin/sh移植性のためにPOSIXシェル()を使用してください。bash通常、単純なスクリプトには必要ありません。
  • ハードコードされた文字列の代わりに変数を使用してください。
  • $(some_command)逆引用符の代わりに構文の使用を検討してください。
  • cat入力しないでgrep使用してください。grep <pattern> <file>
  • なぜ眠る?
  • ファイルが必要ない場合は、一時変数を削除し、代わりにパイプを使用してください。
  • sort | uniqに取り替えることができるsort -u
  • 一時ファイルを使用する必要がある場合は、次の点を考慮してください。正しく清掃してください

答え2

以下は、「1行」のスクリプトのバリエーションです。

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

中間一時ファイルの生成を防ぎます。可能より速く。しかし、これらの中間ファイルが必要または使用されている場合、1行はより悪い方向です。

よく書かれたシェルスクリプトを十分に読んで学んだことの1つは、「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'

とりわけ、このパラメータセットは設定されていない変数による驚きを減らすのに非常に役立ちます。

関連情報