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'

除其他事项外,这组参数确实有助于减少未设置变量带来的意外情况。

相关内容