在每个脚本的开头都使用"#!",这意味着告诉你的系统这个文件的执行需要指定一个解释器.#!实际上是一个2
字节[1]的魔法数字,这是指定一个文件类型的特殊标记, 换句话说, 在这种情况下,指的就是一个可执行的脚本(键入man magic
来获得关于这个迷人话题的更多详细信息).在#!之后接着是一个路径名.这个路径名指定了一个解释脚本中命令的程序,这个程序可以是shell,程序语言或者是任意一个通用程序.这个指定的程序从头开始解释并且执行脚本中的命令(从#!行下边的一行开始),忽略注释.
如:
1 #!/bin/sh
2 #!/bin/bash
3 #!/usr/bin/perl
4 #!/usr/bin/tcl
5 #!/bin/sed -f
6 #!/usr/awk -f
上边每一个脚本头的行都指定了一个不同的命令解释器,如果是/bin/sh,那么就是默认shell(在Linux
系统中默认是Bash)。使用#!/bin/sh,在大多数商业发行的UNIX 上,默认是Bourne
shell,这将让你的脚本可以正常的运行在非Linux 机器上,虽然这将会牺牲Bash 一些独特的特征. 脚本将与POSIX的sh
标准相一致.
注意: #!
后边给出的路径名必须是正确的,否则将会出现一个错误消息,通常是"Command not
found",这将是你运行这个脚本时所得到的唯一结果.
当然"#!"也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用shell
内建的指令了,如果不能使用变量的话,当然这也就失去了脚本编程的意义了.
那些具有UNIX 味道的脚本(基于4.2BSD)需要一个4
字节的魔法数字,在#!后边需要一个空格#! /bin/sh.
脚本中的#!行的最重要的任务就是命令解释器(sh
或者bash).因为这行是以#开始的,当命令解释器执行这个脚本的时候,会把它作为一个注释行.当然,在这之前,这行语句已经完成了它的任务,就是调用命令解释器.
如果在脚本的里边还有一个#!行,那么bash
将把它认为是一个一般的注释行.
1 #!/bin/bash
2
3 echo "Part 1 of script."
4 a=1
5
6 #!/bin/bash
7 # 这将不会开始一个新脚本.
8
9 echo "Part 2 of script."
10 echo $a # Value of $a stays at 1.
脚本执行的时候:
小心:使用sh scriptname
来调用脚本的时候将会关闭一些Bash 特定的扩展,脚本可能因此而调用失败.
为什么不直接使用scriptname
来调用脚本?如果你当前的目录下($PWD)正好有你想要执行的脚本,为什么它运行不了呢?失败的原因是,出于安全考虑,当前目录并没有被加在用户的$PATH
变量中.因此,在当前目录下调用脚本必须使用./scriptname 这种形式.