高级Bash脚本编程指南(2):带着一个Sha-Bang出发

特别说明,Sha-Bang 指的是 ( #! ) 。

在一个最简单的例子中,一个shell脚本其实就是将一堆系统命令列在一个文件中。它的最基本的用处就是,在你每次输入特定顺序的命令时,可以少敲一些字。

以清除/var/log下的某些log文件的脚本为例:

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp

echo "Logs clean up"

但是该脚本有很多问题,而且也不规范,运行该脚本得到如下结果:

这里写图片描述

对该脚本进行改良,得到如下脚本:

#!/bin/bash

LOG_DIR=/var/log

cd $LOG_DIR
cat /dev/null > messages
cat /dev/null > wtmp

echo "Logs clean up."
exit

相比于第一个脚本,该脚本主要做了三个改进:

  • 脚本的第一行为#!/bin/bash,这是一个Bash脚本的正确的开头部分;
  • 使用变量来指定日志目录,使用变量比把代码写死要好的多。
  • 脚本的最后一行使用exit命令,这个命令是一种正确并且合适的退出脚本的方法。

接下来看一个真正意义的脚本:

#!/bin/bash

# Copyright (C) fuchencong@163.com

LOG_DIR=/var/log
ROOT_UID=0
LINES=50
E_XCD=66
E_NOTROOT=67

if [ "$UID" -ne "$ROOT_UID" ]
then
    echo "Must be root to run this script."
    exit $E_NOTROOT
fi


if [ -n "$1" ]
then
    lines=$1
else
    lines=$LINES
fi


cd $LOG_DIR
if [ `pwd` != "$LOG_DIR" ]
then
    echo "Can't change to $LOG_DIR."
    exit $E_XCD
fi

# more efficent way
# cd $LOG_DIR || {
#   echo "Cannot change to necessary directory." > &2
#   exit $E_XCD
# }


tail -$lines messages > mesg.tmp
mv mesg.tmp messages

: > wtmp
echo "Logs cleaned up."

exit 0

在每个脚本的开头都是用”#!”,这意味着告诉你的系统这个文件的执行需要指定一个解释器。”#!”是一个两个字节的魔数字,是一个指定文件类型的特殊标记,换句话说,指的就是一个可执行脚本。在#!之后接着是一个路径名,这个路径名指定了一个解释脚本中命令的程序。这个程序可以是shell,或者任意一个通用程序。这个指定的程序从头开始解释并且执行脚本中的命令(从#!下边的一行开始)。

#!也可以被忽略,此时这样的脚本文件就只是命令的集合,无法使用shell内建的指令了。

可以玩一些小技巧:

#!/bin/more

show line 1
show line 2
show line 3
show line 4
show line 5
show line 6
show line 7
show line 8
show line 9
show line 10

上面这个脚本指定more命令作为解释器,运行时会把自己进行显示:

这里写图片描述

#!行最重要的任务就是命令解释器。因为这行是#开始的,当命令解释器执行这行代码时,会把它作为一个注释行。当然,在这之前,这行语句已经完成了它的任务,就是调用命令解释器。

调用一个脚本:

编写完脚本之后,可以使用sh scriptname或者bash scriptname来调用它。更方便的方法是让脚本本身就具有可执行权限,然后使用./scriptname的方式来执行它。

在脚本被测试和debug后,你可以把它移动到/usr/local/bin,来让你的脚本对所有用户都有用,这样用户就可以直接输入脚本名字来运行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值