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

《Shell脚本学习指南》笔记--2011-12-17相关推荐

  1. 【Shell脚本学习指南笔记】重定向文件描述符 21

    如: make > results 2>&1 重定向 > results让文件描述符1(标准输出)作为文件results,接下来的重定向2>&1有两个部分.2& ...

  2. 《Shell脚本学习指南》读书笔记

    P30-31 软件工具的原则 1.一次做好一件事 2.处理文本行,不要处理二进制数据 3.使用正则表达式 4.默认使用标准输入/输出 5.避免喋喋不休 6.输出格式必须与可接受的输入格式一致 7.让工 ...

  3. 《Shell脚本学习指南》第一章 背景知识

    1.1 Unix简史 Unix第一版诞生于1970年,也就是贝尔实验室退出Multics项目不久. 在Unix广受欢迎的功能中,有许多是来自Multics操作系统. 其中最著名的有:将设备视为文件,以 ...

  4. Shell脚本学习指南(三)——文本处理工具

    文章目录 排序文本 行的排序 以字段的排序 文本块排序 sort的效率 sort的稳定性 sort小结 删除重复 重新格式化段落 计算行数.字数以及字符数 打印 打印技术的演化 其他打印软件 提取开头 ...

  5. Shell脚本学习指南(六)——输入/输出、文件与命令执行

    文章目录 前言 标准输入.标准输出与标准错误输出 使用read读取行 关于重定向 额外的重定向运算符 文件描述符处理 printf的完整介绍 波浪号展开与通配符 波浪号展开 使用通配符 命令替换 为h ...

  6. Shell脚本学习指南(七)——产生脚本

    文章目录 前言 路径查找 软件构建自动化 前言 本篇,我们将进一步处理更复杂的工作.我们认为这里举出的例子都是一般用得到的工具,它们每一个都截然不同,且在大多数UNIX工具集里也没有. 在篇中的程序, ...

  7. linux shell脚本学习指南,shell脚本学习指南[二](Arnold Robbins Nelson H.F. Beebe著)

    该进入第四章了,刚才看到一个帖子标题:我空有一身泡妞的好本领,但可惜自己是个妞.汗-这个...音乐无国界嘛,这个不应该也没性别界么? 第四章文本处理工具 书中先说明了以下排序的规则,数值的就不用说了, ...

  8. Shell脚本学习指南 - 第二章入门篇

    shell脚本的第一行#! #! /bin/awk -f 内核会扫描文件开头的#!后面内容,跳过所有空白符号,寻求可以用来执行程序的解释器的full path和option(option后面的空格会识 ...

  9. Shell脚本学习指南-查找与替换篇

    一.查找与替换 编写 Shell脚本时经常用到的两个基本操作: 1.文本查找 (searching) - 寻找含有特定文本的行 2.文本替换(substitution)- 更换找到的文本 可以使用固定 ...

  10. Shell脚本学习指南(二)——查找与替换

    文章目录 前言 查找文本 简单的grep 正则表达式 什么是正则表达式 POSIX方括号表达式 基本正则表达式 匹配单个字符 后向引用 单个表达式匹配多字符 文本匹配锚点 BRE运算符优先级 匹配单个 ...

最新文章

  1. Word2010开发——操作文档
  2. CloudStack相关技术-主存储和二级存储
  3. SHE PWM的simulink仿真谐波分析
  4. 图像边缘检测,检测亦或简化
  5. 人工智能 | 自然语言处理(NLP)研究团队
  6. 数学--数论--同余及其性质(超详细)
  7. mac java版本 不一致_mac实现不同版本的jdk切换
  8. IOS – OpenGL ES 调节图像灰色 GPUImageGrayscaleFilter
  9. Qt文档阅读笔记-ToolBar QML Type
  10. IP地址在数据库里面的存储方式
  11. python循环小练习
  12. C# 16进制转10进制 16进制字符串转换
  13. WebRAY权小文:产品就是工程师的尊严
  14. 项目开发的完整流程(详解版)
  15. 三维扫描仪行业调研报告 - 市场现状分析与发展前景预测
  16. php强行横屏,强制横屏app
  17. Mariadb的基本使用(一篇涵盖基本操作)
  18. 局部语义地图构建——HDMapNet
  19. 用C语言恶搞你的好朋友strcmp()
  20. SwiftUI macOS源码大全之倒计时App基于coredata(教程含源码)

热门文章

  1. steam常用计算机,絮絮叨叨的繁星 篇二:新电脑必备——常用验机和跑分软件汇总...
  2. Vue中使用Video标签播放 <解析后的短视频>去水印视频无响应
  3. C语言小案例_OA大典故障案例摘录【第1392篇】兄弟9140cdn彩机报:!硒鼓!滑动硒鼓单元上的绿色滑块bk黑色c青色m品红色y黄色...
  4. 【读书笔记】 —— 《数学女孩》
  5. java wsdl 服务端代码_wsdl2java 生成 webservice服务端代码:
  6. 准双向口和KELL C头文件已经处理
  7. PS/PR/AE插件免费下载网站整理(附送一键安装包)
  8. hp1015驱动64位_惠普1015驱动下载|惠普1015打印机驱动电脑版 - 极光下载站
  9. 黑马程序员视频-微信小程序-原生框架——项目搭建
  10. ati 缺少关键性文件_ATI显卡优化