❶ #!/bin/bash
echo "Hello World"
echo $(which neqn)
cat $(which neqn)
我们在脚本顶端加上了一行/bin/bash❶。这行叫作shebang。shebang允许你指定用哪个程序来解释脚本。这里选择将文件作为bash脚本。你可能还碰到过其他shebang,例如针对Perl(#!/usr/bin/perl)或Ruby(#!/usr/bin/env ruby)的。
shebang:这个词其实是两个字符名称sharp-bang 的简写。在Unix 的行话里,用sharp 或hash(有时候是mesh)来称呼字符“#”,用bang 来称呼惊叹号“!”,因而shebang 合起来就代表了这两个字符。详情请参考:en.wikipedia.org/wiki/Shebang_(Unix)。
有了这行,还得设置文件权限才能像其他程序那样直接运行shell脚本。在终端中的操作方法如代码清单0-6所示。
代码清单0-6将脚本intro的权限修改为可执行
❶ $ chmod +x intro
❷ $ ./intro
Hello World
/usr/bin/neqn
#!/bin/sh
# Provision of this shell script should not be taken to imply that use of
# GNU eqn with groff -Tascii|-Tlatin1|-Tutf8|-Tcp1047 is supported.
GROFF_RUNTIME="${GROFF_BIN_PATH=/usr/bin}:"
PATH="$GROFF_RUNTIME$PATH"
export PATH
exec eqn -Tascii ${1+"$@"}
# eof
$
我们用到了权限修改命令chmod❶并将+x作为命令参数,该参数可以将随后指定的文件设置为可执行权限。权限设置好之后,不用调用bash就可以直接运行shell脚本❷。这是一种很好的shell脚本编程实践,在你以后精进技艺的过程中就会发现它的作用了。
这只是一个简单的例子,告诉你如何运行shell脚本,如何使用shell脚本运行其他的shell脚本。在今后编写shell脚本的时候,你也会看到更多的shebang。
为什么要用shell脚本
你也许疑惑为什么偏要选择bash shell脚本,而不去用那些漂亮的新语言,比如Ruby或Go。尽管这些语言都试图在多种系统上实现可移植性,但它们通常并没有被默认安装。原因很简单:所有Unix机器上都已经有了一个基本的shell,而且绝大多数用的都是bash shell。
文章开头也提到过卡盟,微软最近在Windows 10中也加入了多数Linux发行版和OS X中采用的bash shell。这意味着你的shell脚本几乎不需要做什么额外的工作,就拥有了比以往更好的可移植性。相较于其他语言,shell脚本能够更准确、更轻松地完成系统维护及其他任务。
代码清单0-7中展示了一个方便的微型shell脚本(没错,只有一行),完全可移植。该脚本可以统计出OpenOffice文档目录中的文档共有多少页,这对于作者特别有用。
代码清单0-7统计OpenOffice文档目录中文档页面数量的bash脚本
#!/bin/bash
echo "$(exiftool *.odt | grep Page-count | cut -d ":" -f2 | tr '\n' '+')""0" | bc