书名/ Shell脚本学习指南
书号/ ISBN 978-7-111-25504-8
版次/ 2009年4月第1版 2009年4月第1次印刷
<手机像素太差,只好网上找张图贴上>
借于XX学院图书馆
==============================================================\
P23 2.3 一个简单的脚本
###############原文引用P24#############################################################
小型Shell脚本的典型开发周期:
首先,直接在命令行( Command line)上测试。然后,一旦找到能够完成工作的适当语法,再将它们放进一个独立的脚本里,并为该脚本设置执行的权限。之后,就能直接使用该脚本。
######################################################################################
例子:
$who 系统目前登录的人
$wc -l 字符统计
$who | wc -l 计算当前系统中用户个数
至此,命令行中测试正常。将其编写为独立脚本
$cat > nusers 建立文件,使用cat复制终端输入
who | wc -l 程序内容
^D Ctrl+D表示end-of-file
$chmod +x nusers 让文件拥有执行权限
$./nusers 执行测试
14 输出我们要的结果
==========================================================
P24 2.4 自给自足的脚本:位于第一行的#!
###############原文引用P24#############################################################
当系统仅有一个shell时,“退回到/bin/sh”的机制非常方便。但现行的UNIX系统都会拥有好几个Shell,因此需要通过一种方式,告知UNIX内核应该以那个Shell来执行所指定的Shell脚本。事实上,这么做有助于执行机制的通用化,让用户的一支接引用任何的程序语言解释器,而非只是一个命令Shell。方法是,通过脚本文件中特殊的第一行来设置:在第一行的开头处使用#!这两个字符
########################################################################################
这段说明了第一行的作用,及如何书写第一行
###############原文引用P25#############################################################
当一个文件中开头的两个字符是#!时,内核会扫描该行其余的部分,看是否存在可用来执行程序的解释器的完整路径。(中间如果出现任何空白符号都会略过。)此外,内核还会扫描是否有一个选项要传递给解释器。内核会以被指定的的选项来引用解释器,再搭配命令行的其他部分。举例来说,假设有一个csh脚本(注3),名为/usr/uch/whizprog,它的第一行如下所示:
#! /bin/csh -f
再者,如果shell的查找路径(后面会有介绍)里有/usr/ucb,当用户键入whizprog -q 、dev/tty01 这条命令后,便会以如下的方式来引用csh:
/bin/csh -f /usr/ucb/whizprog -q /dev/tty01
这样的机制让我们得以轻松地引用任何的解释器。例如我们可以这样引用独立的wak程序:
#! /bin/awk -f
此处为awk程序
Shell脚本通常一开始都是#! /bin/sh。如果你的/bin/sh 并不符合POSIX标准,请将这个路径改为符合POSIX标准的Shell。
############################################################################################
这段说明内核如何根据第一行的#!执行shell脚本 。如何正确指明路径
###############原文引用P25#############################################################
下面是几个初级的陷阱(gotchas),请特别留意:
# 当今的系统,对#!这一行的长度限制从63到1024个字符(character)都有。请尽量不要超过64个字符。(表2-1列出了各个系统的长度差别)
# 在某些系统上,命令行部分(也就是要传递给解释器执行的命令)包含了命令的完整路径。不过有些系统却不是这样;命令行的部分会原封不动地传递给程序。因此,脚本是否具有可移植性取决于是否又完成的路径名称。
# 别在选项(option)之后放置任何空白,因为空白也会跟着选项一起传递给被引用的程序
# 你需要知道解释器的完成路径名称。这样来可以规避可移植性问题,因为不同的厂商可能将同样的东西放在不同的地方(例如 /bin/awk和 /usr/bin/awk)。
# 在一些较旧的系统上,内核不具备解释#!的能力,有些Shell会自行处理,这些Shell对于#!与紧随其后的解释器名称之间是否可以有空白,可能有不同的解释。
表 2-1:各系统对#!行的长度限制
平台 操作系统版本 最大长度
Apple Power Mac Mac Darwin 7.2(Mac OS 10.3.2) 512
Compaq/DEC Alpha OSF/1 4.0 1024
Compaq/DEC/HP Alpha OSF/1 5.1 1000
GUN/Linux Red Hat 6, 7, 8, 9;Fedora 1 127
HP PA-RISC and Itanium-2 HP-UX 10,11 127
IBM RS/6000 AIX 4.2 255
Intel X86 FreeBSD 4.4 64
Intel X86 FreeBSD 4.9,5.0,5.1 128
Intel X86 NetBSD 1.6 63
Intel X86 OpenBSD 3.2 63
SGI MIPS IRIX 6.5 255
Sun SPARC,x86 Solaris 7,8,9,10 1023
=================================================================================
另外再编写Shell时,最好再选项后加入 - 。“可避免某种程度的欺骗时攻击(spoofing attack)”
改进后的文件内容为:
#! /bin/sh -
who | wc - l