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

다음은 "한 줄짜리" 스크립트의 변형입니다.

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

중간 임시 파일 생성을 방지합니다.5월더 빨라지세요. 그러나 해당 중간 파일이 필요하거나 사용되는 경우 단일 라이너는 더 나쁜 방향입니다.

잘 작성된 쉘 스크립트를 충분히 읽으면서 배운 것 중 하나는 "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'

이 매개변수 세트는 무엇보다도 설정되지 않은 변수로 인한 놀라움을 줄이는 데 실제로 도움이 됩니다.

관련 정보