📄 sha-bang.html
字号:
虽然这将会牺牲Bash一些独特的特征. 但是脚本将与<ACRONYMCLASS="ACRONYM">POSIX</ACRONYM> <ANAME="AEN246"HREF="#FTN.AEN246"><SPANCLASS="footnote">[4]</SPAN></A> 的<BCLASS="COMMAND">sh</B>标准相一致. </P><P>注意<SPANCLASS="QUOTE">"sha-bang"</SPAN>后边给出的路径名必须是正确的, 否则将会出现一个错误消息 -- 通常是<SPANCLASS="QUOTE">"Command not found"</SPAN> -- 这将是你运行这个脚本时所得到的唯一结果. </P><P>当然<SPANCLASS="TOKEN">#!</SPAN>也可以被忽略, 不过这样你的脚本文件就只能是一些命令的集合, 不能够使用shell内建的指令了. 上边第二个例子必须以<SPANCLASS="TOKEN">#!</SPAN>开头, 是因为分配变量了, <KBDCLASS="USERINPUT">lines=50</KBD>, 这就使用了一个shell特有的用法. <ANAME="AEN263"HREF="#FTN.AEN263"><SPANCLASS="footnote">[5]</SPAN></A> 再次提醒你<KBDCLASS="USERINPUT">#!/bin/sh</KBD>将会调用默认的shell解释器, 在Linux机器上默认是<TTCLASS="FILENAME">/bin/bash</TT>. </P><DIVCLASS="TIP"><P></P><TABLECLASS="TIP"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/tip.gif"HSPACE="5"ALT="Tip"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>这个例子鼓励你使用模块化的方式来编写脚本. 平时也要多注意收集一些比较有代表性的 <SPANCLASS="QUOTE">"模版"</SPAN>代码, 这些零碎的代码可能用在你将来编写的脚本中. 最后你就能生成一个很好的可扩展的例程库. 以下边这个脚本为例, 这个脚本用来测试脚本被调用的参数数量是否正确. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 E_WRONG_ARGS=65 2 script_parameters="-a -h -m -z" 3 # -a = all, -h = help, 等等. 4 5 if [ $# -ne $Number_of_expected_args ] 6 then 7 echo "Usage: `basename $0` $script_parameters" 8 # `basename $0` 是这个脚本的文件名. 9 exit $E_WRONG_ARGS 10 fi</PRE></FONT></TD></TR></TABLE> </P><P>大多数情况下,你需要编写一个脚本来执行一个特定的任务, 在本章中第一个脚本就是一个这样的例子, 然后你会修改它来完成一个不同的, 但比较相似的任务. 使用变量来代替写死(<SPANCLASS="QUOTE">"硬编码(hard-wired)"</SPAN>)的常量, 就是一个很好的习惯, 将重复的代码放到一个<AHREF="functions.html#FUNCTIONREF">函数</A>中,也是一种好习惯. </P></TD></TR></TABLE></DIV></DIV><H3CLASS="FOOTNOTES">注意事项</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN206"HREF="sha-bang.html#AEN206"><SPANCLASS="footnote">[1]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>那些具有UNIX味道的脚本(基于4.2BSD)需要一个4字节的魔法数字, 在<SPANCLASS="TOKEN">!</SPAN>后边需要一个空格 -- <KBDCLASS="USERINPUT">#! /bin/sh</KBD>.</P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN217"HREF="sha-bang.html#AEN217"><SPANCLASS="footnote">[2]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>脚本中的<SPANCLASS="TOKEN">#!</SPAN>所在的行的最重要的任务就是告诉系统本脚本是使用哪种命令解释器. (<BCLASS="COMMAND">sh</B>或者<BCLASS="COMMAND">bash</B>). 因为这行是以<SPANCLASS="TOKEN">#</SPAN>作为行的开头, 当命令解释器执行这个脚本的时候,会把它作为一个注释行. 当然, 在这之前, 这行语句已经完成了它的任务, 就是调用命令解释器. </P><P>如果脚本中还包含有 <EM>其他</EM>的<SPANCLASS="TOKEN">#!</SPAN>行, 那么<BCLASS="COMMAND">bash</B>将会把它看成是一个一般的注释行. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 3 echo "Part 1 of script." 4 a=1 5 6 #!/bin/bash 7 # 这将*不会*启动一个新脚本. 8 9 echo "Part 2 of script." 10 echo $a # Value of $a stays at 1.</PRE></FONT></TD></TR></TABLE></P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN233"HREF="sha-bang.html#AEN233"><SPANCLASS="footnote">[3]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>这里可以玩一些小技巧.</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/rm 2 # 自删除脚本. 3 4 # 当你运行这个脚本时, 基本上什么都不会发生. . . 当然这个文件消失不见了. 5 6 WHATEVER=65 7 8 echo "This line will never print (betcha!)." 9 10 exit $WHATEVER # 不要紧, 脚本是不会在这退出的. </PRE></FONT></TD></TR></TABLE> </P><P>当然,你还可以试试在一个<TTCLASS="FILENAME">README</TT>文件的开头加上一个<KBDCLASS="USERINPUT">#!/bin/more</KBD>, 并让它具有执行权限. 结果将是文档自动列出自己的内容. (一个使用<AHREF="basic.html#CATREF">cat</A>命令的 <AHREF="here-docs.html#HEREDOCREF">here document</A>在这里可能是一个更好的选择, -- 参见<AHREF="here-docs.html#EX71">例子 17-3</A>).</P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN246"HREF="sha-bang.html#AEN246"><SPANCLASS="footnote">[4]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P><ANAME="POSIX2REF"></A><STRONG>P</STRONG>ortable <STRONG>O</STRONG>perating <STRONG>S</STRONG>ystem <EM>I</EM>nterface(可移植的操作系统接口), 标准化类UNI<STRONG>X</STRONG>操作系统的一种尝试. POSIX规范可以在<AHREF="http://www.opengroup.org/onlinepubs/007904975/toc.htm"TARGET="_top">Open Group site</A>中进行查阅.</P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN263"HREF="sha-bang.html#AEN263"><SPANCLASS="footnote">[5]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>如果Bash是你的默认shell, 那么脚本的开头也不用非得写上<SPANCLASS="TOKEN">#!</SPAN>. 但是如果你使用不同的shell来开启一个脚本的话, 比如<ICLASS="FIRSTTERM">tcsh</I>, 那么你就<EM>必须</EM>需要<SPANCLASS="TOKEN">#!</SPAN>了. </P></TD></TR></TABLE><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="why-shell.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="invoking.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">为什么使用shell编程?</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="part1.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">调用一个脚本</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -