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

중간 임시 파일 생성을 방지합니다.가능한더 빠르게. 그러나 이러한 중간 파일이 필요하거나 사용하는 경우 한 줄은 더 나쁜 방향입니다.

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

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

관련 정보