特别说明,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,来让你的脚本对所有用户都有用,这样用户就可以直接输入脚本名字来运行了。