《Shell脚本学习指南》笔记--2011-12-17

书名/  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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值