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

来源:互联网 发布:天天炫斗刷钻石软件 编辑:程序博客网 时间:2024/05/17 08:08

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

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

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

cd /var/logcat /dev/null > messagescat /dev/null > wtmpecho "Logs clean up"

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

这里写图片描述

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

#!/bin/bashLOG_DIR=/var/logcd $LOG_DIRcat /dev/null > messagescat /dev/null > wtmpecho "Logs clean up."exit

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

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

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

#!/bin/bash# Copyright (C) fuchencong@163.comLOG_DIR=/var/logROOT_UID=0LINES=50E_XCD=66E_NOTROOT=67if [ "$UID" -ne "$ROOT_UID" ]then    echo "Must be root to run this script."    exit $E_NOTROOTfiif [ -n "$1" ]then    lines=$1else    lines=$LINESficd $LOG_DIRif [ `pwd` != "$LOG_DIR" ]then    echo "Can't change to $LOG_DIR."    exit $E_XCDfi# more efficent way# cd $LOG_DIR || {#   echo "Cannot change to necessary directory." > &2#   exit $E_XCD# }tail -$lines messages > mesg.tmpmv mesg.tmp messages: > wtmpecho "Logs cleaned up."exit 0

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

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

可以玩一些小技巧:

#!/bin/moreshow line 1show line 2show line 3show line 4show line 5show line 6show line 7show line 8show line 9show line 10

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

这里写图片描述

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

调用一个脚本:

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

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

0 0
原创粉丝点击