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

《Shell脚本学习指南》笔记–2011-12-17书名 nbsp Shell 脚本学习指南书号 ISBN978 7 111 25504 8 版次 2009 年 4 月第 1 版 2009 年 4 月第 1 次印刷借于 XX 学院图书馆

书名/  Shell脚本学习指南

书号/ ISBN 978-7-111-25504-8

版次/ 2009年4月第1版 2009年4月第1次印刷

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

<手机像素太差,只好网上找张图贴上>

借于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 自给自足的脚本:位于第一行的#!

当系统仅有一个shell时,“退回到/bin/sh”的机制非常方便。但现行的UNIX系统都会拥有好几个Shell,因此需要通过一种方式,告知UNIX内核应该以那个Shell来执行所指定的Shell脚本。事实上,这么做有助于执行机制的通用化,让用户的一支接引用任何的程序语言解释器,而非只是一个命令Shell。方法是,通过脚本文件中特殊的第一行来设置:在第一行的开头处使用#!这两个字符

#

这段说明了第一行的作用,及如何书写第一行

当一个文件中开头的两个字符是#!时,内核会扫描该行其余的部分,看是否存在可用来执行程序的解释器的完整路径。(中间如果出现任何空白符号都会略过。)此外,内核还会扫描是否有一个选项要传递给解释器。内核会以被指定的的选项来引用解释器,再搭配命令行的其他部分。举例来说,假设有一个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脚本 。如何正确指明路径

下面是几个初级的陷阱(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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212750.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:21
下一篇 2026年3月18日 下午7:21


相关推荐

  • logback自定义日志格式

    logback自定义日志格式logback自定义日志格式1.ClassicConverter继承ClassicConverterpackagecom.demo.conf;importch.qos.logback.classic.pattern.ClassicConverter;importch.qos.logback.classic.spi.ILoggingEvent;importjava.net…

    2022年5月2日
    70
  • 均匀分布的均值及方差

    均匀分布的均值及方差

    2026年1月18日
    4
  • 笔记本(无线网卡)配置虚拟机上网

    笔记本(无线网卡)配置虚拟机上网当我们安装了virtualbox或者VMware虚拟机,都会虚出一个虚拟网卡。如果我们使用的是网线上网,那么可以选择“网桥”的方式让虚拟机上网,这样可以保证虚拟机和主机之间互通,而且虚拟机也可以访问外网。这时,虚拟机可以使用dhcp也可以手工的方式指定ip。那么,如果笔记本使用的是无线网卡上网,那么就无法使用“网桥”的方式配置虚拟机上网了。这时,可以使用host-only的配置方式,同

    2022年5月19日
    46
  • C语言socket[通俗易懂]

    C语言socket[通俗易懂]2.相关api介绍asocket函数:对创建套接字(的方法进行说明。#includesys/socket.hintsocket(intaf、inttype、intprotocol);af:地址的说明。仅支持AF_INET格式,即ARPA互联网地址格式。类型:指定套接字类型。新套接字的类型描述类型,如TCP(sock_stream)或UDP(sock_dgram)。常用的socket类型有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACK

    2022年7月13日
    15
  • git clone 后的文件找不到在哪?

    git clone 后的文件找不到在哪?经常在gihub上下载文件,但是发现这样clone下后不知道文件给放哪了?一般情况下会存放在命令行对应的目录下:win+R>cmd查看命令行地址:这个地址就是你git后的地址。如果想要改变git后的存放地址也简单,先改变命令行的地址,在gitclone文件,这里提供一个快捷的方式,在你目标文件夹下,shift+右键,选择打开powershell窗口,就会打开…

    2022年7月21日
    274
  • date和calendar_Calendar类

    date和calendar_Calendar类时间和日期处理 在程序中,某个固定的时间代表的都是一个时间点,也就是一个时间的瞬间,例如2009年3月8日15点50分0秒,在实际的应用中,经常需要对于两个时间进行比较或计算时间之间的差值,这些功能在Java语言中都可以很方便的实现。 在Java语言中,时间的表达单位是毫秒。也就是说,Java语言中的时间处理可以精确到毫秒。 在Java语言中,表达时间的方式有两种: a、绝

    2026年2月21日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号