#!/bin/bash
# 以上是 Shell 脚本的解释器,开头必须要写,表示 Shell 脚本。/bin/sh 更多的用于 UNIX 下,并且相比 Bash 少了一些特性。更多地使用 /bin/bash,但是在 Linux 中 /bin/sh 是 /bin/bash 的软链接。
# Cleanup, version 3
LOG_DIR=/var/log # 这里定义变量,一般都会定义经常用的内容,引用变量更专业更方便。
ROOT_UID=0 # 只有 root 用户才有权限。root 的 $UID 为 0。
LINES=50 # 保存多少行。
E_XCD=86 # 不能切换目录,导致退出的错误代码。
E_NOROOT=87 # 不是 root 用户,没权限退出的错误代码。
if [ "$UID" -ne "$ROOT_UID" ] # 如果当前用户不是 root。-ne 表示不等于,-eq 表示等于。
then
echo "Must be root to run this script." # 则打印。
exit $E_NOROOT # 并且退出。
fi
if [ -n "$1" ] # 如果第一个参数(位于脚本后)不是非空。n 表示 non-zero。
then
lines=$1 # 把第一个参数的值赋给变量 lines。
else
lines=$LINES # 如果第一个参数是空,则 lines 值为变量 LINES 赋予的值,为 50。
fi
### 以上这段也可以下面代替###
#######################################################################
E_WRONGARGS=85 # 非数字退出代码。
case "$1" in
"") lines=$LINES;; # 如果第一个参数是空,则 lines 为 50。
*[!0-9]*) echo "Usage `basename $0` lines-to-cleanup`"; exit $E_WRONGARGS;; # 也可以写成 *[^0-9]*。是通配符语法,字符串中有一个非数字,整个字符串就是非纯数字。[[:digit:]] 也是表示数字,但是只表示一个数字。`basename $0` 是脚本的自己名字(不含路径)。如果第一个参数输入的是非纯数字,则打印错误代码。
*) lines=$1;; # 如果第一个参数是纯数字,则 lines 为参数值。
esac
#######################################################################
cd $LOG_DIR
if [ `pwd` != "$LOG_DIR" ] # 这里的 `pwd` 也可以写成 $PWD。!= 表示不等于,也可以用 -ne。
then
echo "Can‘t change to $LOG_DIR."
exit $E_XCD
fi
### 上述代码也可以写成 ###
#######################################################################
cd $LOG_DIR || {
echo "Cant‘ change to necessary directory." >&2 # >&2 也就是 1>&2,就是把标准输出重定向到标准错误。但是这里加不加都一样的。|| 表示前面的命令执行失败后,执行后面的命令。若前面的命令执行成功,则后面的命令不执行。
exit $E_XCD;
}
#######################################################################
tail -n $lines messages > mesg.tmp
mv mesg.temp messages
cat /dev/null > wtmp # 清空 wtmp,: > wtmp 和 > wtmp 是一样效果。
echo "Log files are cleaned up."
exit 0 # 表示全都执行完了,最后输出状态代码 0,表示成功。