⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sha-bang.html

📁 BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>带着一个Sha-Bang出发(Sha-Bang指的是#!)</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="热身"HREF="part1.html"><LINKREL="PREVIOUS"TITLE="为什么使用shell编程?"HREF="why-shell.html"><LINKREL="NEXT"TITLE="调用一个脚本"HREF="invoking.html"></HEAD><BODYCLASS="CHAPTER"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="why-shell.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom"></TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="invoking.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="CHAPTER"><H1><ANAME="SHA-BANG"></A>2. 带着一个Sha-Bang出发(Sha-Bang指的是#!)</H1><TABLEBORDER="0"WIDTH="100%"CELLSPACING="0"CELLPADDING="0"CLASS="EPIGRAPH"><TR><TDWIDTH="45%">&nbsp;</TD><TDWIDTH="45%"ALIGN="LEFT"VALIGN="TOP"><I><P><I>Shell程序设计是1950年的光盘机 . . .</I></P></I></TD></TR><TR><TDWIDTH="45%">&nbsp;</TD><TDWIDTH="45%"ALIGN="RIGHT"VALIGN="TOP"><I><SPANCLASS="ATTRIBUTION">Larry Wall</SPAN></I></TD></TR></TABLE><DIVCLASS="TOC"><DL><DT><B>目录</B></DT><DT>2.1. <AHREF="invoking.html">调用一个脚本</A></DT><DT>2.2. <AHREF="prelimexer.html">初步的练习</A></DT></DL></DIV><P>在一个最简单的例子中, 一个shell脚本其实就是将一堆系统命令列在一个文件中. 		它的最基本的用处就是, 在你每次输入这些特定顺序的命令时可以少敲一些字. </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX1"></A><P><B>例子 2-1. <BCLASS="COMMAND">清除</B>: 清除/var/log下的log文件</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;# 清除  2&nbsp;# 当然要使用root身份来运行这个脚本.  3&nbsp;  4&nbsp;cd /var/log  5&nbsp;cat /dev/null &#62; messages  6&nbsp;cat /dev/null &#62; wtmp  7&nbsp;echo "Logs cleaned up."</PRE></FONT></TD></TR></TABLE><HR></DIV><P>这根本就没什么稀奇的, 只不过是命令的堆积, 		来让从console或者<ICLASS="FIRSTTERM">xterm</I>中一个一个的输入命令更方便一些. 		好处就是把所有命令都放在一个脚本中,不用每次都敲它们.       这样的话, 这个脚本就成为了一个<EM>工具</EM>,     对于特定的应用来说,这个脚本就很容易被修改或定制.      </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX1A"></A><P><B>例子 2-2. <BCLASS="COMMAND">清除</B>:一个改良的清除脚本      </B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# 一个Bash脚本的正确的开头部分.  3&nbsp;  4&nbsp;# Cleanup, 版本 2  5&nbsp;  6&nbsp;# 当然要使用root身份来运行.  7&nbsp;# 在此处插入代码,来打印错误消息,并且在不是root身份的时候退出.  8&nbsp;  9&nbsp;LOG_DIR=/var/log 10&nbsp;# 如果使用变量,当然比把代码写死的好. 11&nbsp;cd $LOG_DIR 12&nbsp; 13&nbsp;cat /dev/null &#62; messages 14&nbsp;cat /dev/null &#62; wtmp 15&nbsp; 16&nbsp; 17&nbsp;echo "Logs cleaned up." 18&nbsp; 19&nbsp;exit # 这个命令是一种正确并且合适的退出脚本的方法.</PRE></FONT></TD></TR></TABLE><HR></DIV><P>现在,让我们看一下一个真正意义的脚本.而且我们可以走得更远 . . .</P><DIVCLASS="EXAMPLE"><HR><ANAME="EX2"></A><P><B>例子 2-3. <BCLASS="COMMAND">清除</B>: 一个增强的和广义的删除logfile的脚本      </B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# 清除, 版本 3  3&nbsp;  4&nbsp;#  警告:  5&nbsp;#  -----  6&nbsp;#  这个脚本有好多特征,  7&nbsp;#+ 这些特征是在后边章节进行解释的.  8&nbsp;#  大概是进行到本书的一半的时候,  9&nbsp;#+ 你就会觉得它没有什么神秘的了. 10&nbsp; 11&nbsp; 12&nbsp; 13&nbsp;LOG_DIR=/var/log 14&nbsp;ROOT_UID=0     # $UID为0的时候,用户才具有root用户的权限 15&nbsp;LINES=50       # 默认的保存行数 16&nbsp;E_XCD=66       # 不能修改目录? 17&nbsp;E_NOTROOT=67   # 非root用户将以error退出 18&nbsp; 19&nbsp; 20&nbsp;# 当然要使用root用户来运行. 21&nbsp;if [ "$UID" -ne "$ROOT_UID" ] 22&nbsp;then 23&nbsp;  echo "Must be root to run this script." 24&nbsp;  exit $E_NOTROOT 25&nbsp;fi   26&nbsp; 27&nbsp;if [ -n "$1" ] 28&nbsp;# 测试是否有命令行参数(非空). 29&nbsp;then 30&nbsp;  lines=$1 31&nbsp;else   32&nbsp;  lines=$LINES # 默认,如果不在命令行中指定. 33&nbsp;fi   34&nbsp; 35&nbsp; 36&nbsp;#  Stephane Chazelas 建议使用下边 37&nbsp;#+ 的更好方法来检测命令行参数. 38&nbsp;#+ 但对于这章来说还是有点超前. 39&nbsp;# 40&nbsp;#    E_WRONGARGS=65  # 非数值参数(错误的参数格式) 41&nbsp;# 42&nbsp;#    case "$1" in 43&nbsp;#    ""      ) lines=50;; 44&nbsp;#    *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;; 45&nbsp;#    *       ) lines=$1;; 46&nbsp;#    esac 47&nbsp;# 48&nbsp;#* 直到"Loops"的章节才会对上边的内容进行详细的描述. 49&nbsp; 50&nbsp; 51&nbsp;cd $LOG_DIR 52&nbsp; 53&nbsp;if [ `pwd` != "$LOG_DIR" ]  # 或者	if[ "$PWD" != "$LOG_DIR" ] 54&nbsp;                            # 不在 /var/log中? 55&nbsp;then 56&nbsp;  echo "Can't change to $LOG_DIR." 57&nbsp;  exit $E_XCD 58&nbsp;fi  # 在处理log file之前,再确认一遍当前目录是否正确. 59&nbsp; 60&nbsp;# 更有效率的做法是: 61&nbsp;# 62&nbsp;# cd /var/log || { 63&nbsp;#   echo "Cannot change to necessary directory." &#62;&#38;2 64&nbsp;#   exit $E_XCD; 65&nbsp;# } 66&nbsp; 67&nbsp; 68&nbsp; 69&nbsp; 70&nbsp;tail -$lines messages &#62; mesg.temp # 保存log file消息的最后部分. 71&nbsp;mv mesg.temp messages             # 变为新的log目录. 72&nbsp; 73&nbsp; 74&nbsp;# cat /dev/null &#62; messages 75&nbsp;#* 不再需要了,使用上边的方法更安全. 76&nbsp; 77&nbsp;cat /dev/null &#62; wtmp  #  ': &#62; wtmp' 和 '&#62; wtmp'具有相同的作用 78&nbsp;echo "Logs cleaned up." 79&nbsp; 80&nbsp;exit 0 81&nbsp;#  退出之前返回0, 82&nbsp;#+ 返回0表示成功.</PRE></FONT></TD></TR></TABLE><HR></DIV><P>因为你可能希望将系统log全部消灭, 这个版本留下了log消息最后的部分.		你将不断地找到新的方法来完善这个脚本,并提高效率. </P><P>要注意,在每个脚本的开头都使用      <ICLASS="FIRSTTERM"> sha-bang</I>      (<SPANCLASS="TOKEN">	 #!</SPAN>), 这意味着告诉你的系统这个文件的执行需要指定一个解释器.   <ANAME="MAGNUMREF"></A>      <SPANCLASS="TOKEN">#!</SPAN> 实际上是一个2字节的	  <ANAME="AEN206"HREF="#FTN.AEN206"><SPANCLASS="footnote">[1]</SPAN></A>		<EM>魔法数字</EM>, 	这是指定一个文件类型的特殊标记, 换句话说, 	在这种情况下, 	指的就是一个可执行的脚本(键入<KBDCLASS="USERINPUT">man magic</KBD>来获得关于这个迷人话题的更多详细信息). 	在<EM>sha-bang</EM>之后接着是一个<ICLASS="FIRSTTERM">路径名</I>. 	这个路径名就是解释脚本中命令的解释程序所在的路径,	可能是一个shell, 也可能是一个程序语言, 也可能是一个工具包中的命令程序.	这个解释程序从头开始解释并且执行脚本中的命令(从<EM>sha-bang</EM>行下边的一行开始), 忽略注释.	  <ANAME="AEN217"HREF="#FTN.AEN217"><SPANCLASS="footnote">[2]</SPAN></A>	</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/sh  2&nbsp;#!/bin/bash  3&nbsp;#!/usr/bin/perl  4&nbsp;#!/usr/bin/tcl  5&nbsp;#!/bin/sed -f  6&nbsp;#!/usr/awk -f</PRE></FONT></TD></TR></TABLE></P><P>上边每一个脚本头的行都指定了一个不同的命令解释器,      如果是<TTCLASS="FILENAME">/bin/sh</TT>, 那么就是默认shell	  (在Linux系统上默认就是<BCLASS="COMMAND">bash</B>), 	  否则的话就是其他解释器.         <ANAME="AEN233"HREF="#FTN.AEN233"><SPANCLASS="footnote">[3]</SPAN></A>	使用<KBDCLASS="USERINPUT">#!/bin/sh</KBD>, 	因为大多数的商业UNIX系统上都是以Bourne shell作为默认shell,    这样可以使脚本<AHREF="portabilityissues.html">移植</A>到non-Linux的机器上, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -