basic.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 1,396 行 · 第 1/2 页

HTML
1,396
字号
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>基本命令</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="外部过滤器, 程序和命令"HREF="external.html"><LINKREL="PREVIOUS"TITLE="外部过滤器, 程序和命令"HREF="external.html"><LINKREL="NEXT"TITLE="复杂命令"HREF="moreadv.html"></HEAD><BODYCLASS="SECT1"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="external.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">12. 外部过滤器, 程序和命令</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="moreadv.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="BASIC">12.1. 基本命令</A></H1><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="BASICCOMMANDS1"></A>新手必须要掌握的初级命令</B></P><DL><DT><ANAME="LSREF"></A><BCLASS="COMMAND">ls</B></DT><DD><P><SPANCLASS="QUOTE">"列出"</SPAN>文件的基本命令. 			  但是往往就是因为这个命令太简单, 所以我们总是低估它.	      比如, 使用<CODECLASS="OPTION">-R</CODE>选项, 递归选项,		  <BCLASS="COMMAND">ls</B>将会以目录树的形式列出所有文件. 		  另一个很有用的选项<CODECLASS="OPTION">-S</CODE>, 将会按照文件尺寸列出所有文件,	      <CODECLASS="OPTION">-t</CODE>, 将会按照修改时间来列出文件, 	      <CODECLASS="OPTION">-i</CODE>选项会显示文件的inode(请参考<AHREF="moreadv.html#IDELETE">例子 12-4</A>).</P><DIVCLASS="EXAMPLE"><HR><ANAME="EX40"></A><P><B>例子 12-1. 使用<BCLASS="COMMAND">ls</B>命令来创建一个烧录<ABBRCLASS="ABBREV">CDR</ABBR>的内容列表</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# ex40.sh (burn-cd.sh)  3&nbsp;# 自动刻录CDR的脚本.  4&nbsp;  5&nbsp;  6&nbsp;SPEED=2          # 如果你的硬件支持的话, 你可以选用更高的速度.  7&nbsp;IMAGEFILE=cdimage.iso  8&nbsp;CONTENTSFILE=contents  9&nbsp;DEVICE=cdrom 10&nbsp;# DEVICE="0,0"     为了是用老版本的CDR 11&nbsp;DEFAULTDIR=/opt  # 这是包含需要被刻录内容的目录. 12&nbsp;                 # 必须保证目录存在. 13&nbsp;                 # 小练习: 测试一下目录是否存在. 14&nbsp; 15&nbsp;# 使用 Joerg Schilling 的 "cdrecord" 包: 16&nbsp;# http://www.fokus.fhg.de/usr/schilling/cdrecord.html 17&nbsp; 18&nbsp;#  如果一般用户调用这个脚本的话, 可能需要root身份 19&nbsp;#+ chmod u+s /usr/bin/cdrecord 20&nbsp;#  当然, 这会产生安全漏洞, 虽然这是一个比较小的安全漏洞. 21&nbsp; 22&nbsp;if [ -z "$1" ] 23&nbsp;then 24&nbsp;  IMAGE_DIRECTORY=$DEFAULTDIR 25&nbsp;  # 如果命令行没指定的话, 那么这个就是默认目录. 26&nbsp;else 27&nbsp;    IMAGE_DIRECTORY=$1 28&nbsp;fi 29&nbsp; 30&nbsp;# 创建一个"内容列表"文件. 31&nbsp;ls -lRF $IMAGE_DIRECTORY &#62; $IMAGE_DIRECTORY/$CONTENTSFILE 32&nbsp;# "l" 选项将给出一个"长"文件列表. 33&nbsp;# "R" 选项将使这个列表递归. 34&nbsp;# "F" 选项将标记出文件类型 (比如: 目录是以 /结尾, 而可执行文件以 *结尾). 35&nbsp;echo "Creating table of contents." 36&nbsp; 37&nbsp;# 在烧录到CDR之前创建一个镜像文件. 38&nbsp;mkisofs -r -o $IMAGEFILE $IMAGE_DIRECTORY 39&nbsp;echo "Creating ISO9660 file system image ($IMAGEFILE)." 40&nbsp; 41&nbsp;# 烧录CDR. 42&nbsp;echo "Burning the disk." 43&nbsp;echo "Please be patient, this will take a while." 44&nbsp;cdrecord -v -isosize speed=$SPEED dev=$DEVICE $IMAGEFILE 45&nbsp; 46&nbsp;exit $?</PRE></FONT></TD></TR></TABLE><HR></DIV></DD><DT><ANAME="CATREF"></A><BCLASS="COMMAND">cat</B>, <BCLASS="COMMAND">tac</B></DT><DD><P><BCLASS="COMMAND">cat</B>, 			  是单词<ICLASS="WORDASWORD">concatenate</I>的缩写,			  把文件的内容输出到<TTCLASS="FILENAME">stdout</TT>. 			  当与重定向操作符(<SPANCLASS="TOKEN">&#62;</SPAN>或<SPANCLASS="TOKEN">&#62;&#62;</SPAN>), 			  一般都是用来将多个文件连接起来.	        <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;# Uses of 'cat'  2&nbsp;cat filename                          # 打印出文件内容.  3&nbsp;  4&nbsp;cat file.1 file.2 file.3 &#62; file.123   # 把三个文件连接到一个文件中. </PRE></FONT></TD></TR></TABLE>	      <BCLASS="COMMAND">cat</B>命令的<CODECLASS="OPTION">-n</CODE>选项是为了在目标文件中的所有行前边插入行号. 		  <CODECLASS="OPTION">-b</CODE>也是用来加行号的, 		  但是不对空行进行编号.	      <CODECLASS="OPTION">-v</CODE>选项可以使用<SPANCLASS="TOKEN">^</SPAN>标记法来echo出不可打印字符. 		  <CODECLASS="OPTION">-s</CODE>选项可以把多个空行压缩成一个空行. </P><P>请参考<AHREF="textproc.html#LNUM">例子 12-25</A>和<AHREF="textproc.html#ROT13">例子 12-21</A>.</P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>			在一个<AHREF="special-chars.html#PIPEREF">管道</A>中, 			有一种把<TTCLASS="FILENAME">stdin</TT><AHREF="io-redirection.html#IOREDIRREF">重定向</A>到一个文件中更有效的方法,             这种方法比使用<BCLASS="COMMAND">cat</B>文件的方法更高效.             </P><P>	    <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;cat filename | tr a-z A-Z  2&nbsp;  3&nbsp;tr a-z A-Z &#60; filename   #  效果相同, 但是处理更少,  4&nbsp;                        #+ 并且连管道都省掉了. </PRE></FONT></TD></TR></TABLE>            </P></TD></TR></TABLE></DIV><P><BCLASS="COMMAND">tac</B>命令, 就是<ICLASS="WORDASWORD">cat</I>命令的反转, 			这个命令将会从文件结尾部分列出文件的内容. </P></DD><DT><BCLASS="COMMAND">rev</B></DT><DD><P>把每一行中的内容反转, 			  并且输出到<TTCLASS="FILENAME">stdout</TT>上. 			  这个命令与<BCLASS="COMMAND">tac</B>命令的效果是不同的, 			  因为它并不反转行序, 而是把每行的内容反转.	      </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">cat file1.txt</KBD><SAMPCLASS="COMPUTEROUTPUT">This is line 1. This is line 2.</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">tac file1.txt</KBD><SAMPCLASS="COMPUTEROUTPUT">This is line 2. This is line 1.</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">rev file1.txt</KBD><SAMPCLASS="COMPUTEROUTPUT">.1 enil si sihT .2 enil si sihT</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P></DD><DT><BCLASS="COMMAND">cp</B></DT><DD><P><ANAME="CPREF"></A></P><P>这是文件拷贝命令. <KBDCLASS="USERINPUT">cp file1				file2</KBD>把文件<TTCLASS="FILENAME">file1</TT>拷贝到<TTCLASS="FILENAME">file2</TT>, 			如果<TTCLASS="FILENAME">file2</TT>存在的话, 那么<TTCLASS="FILENAME">file2</TT>将被覆盖(请参考<AHREF="moreadv.html#EX42">例子 12-6</A>).</P><DIVCLASS="TIP"><P></P><TABLECLASS="TIP"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/tip.gif"HSPACE="5"ALT="Tip"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>特别有用的选项就是<CODECLASS="OPTION">-a</CODE>选项, 	       这是归档标志(目的是为了copy一个完整的目录树), 	       <CODECLASS="OPTION">-u</CODE>是更新选项, 	       <CODECLASS="OPTION">-r</CODE>和<CODECLASS="OPTION">-R</CODE>选项是递归标志. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;cp -u source_dir/* dest_dir  2&nbsp;#  把源目录"同步"到目标目录上,  3&nbsp;#+  也就是拷贝所有更新的文件和之前不存在的文件. </PRE></FONT></TD></TR></TABLE></P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">mv</B></DT><DD><P>这是文件<EM>移动</EM>命令. 			  它等价于<BCLASS="COMMAND">cp</B>和<BCLASS="COMMAND">rm</B>命令的组合. 			  它可以把多个文件移动到目录中,甚			至将目录重命名.	      想察看<BCLASS="COMMAND">mv</B>在脚本中使用的例子, 	      请参考<AHREF="parameter-substitution.html#RFE">例子 9-19</A>和<AHREF="contributed-scripts.html#RN">例子 A-2</A>. </P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>当使用非交互脚本时, 	      可以使用<BCLASS="COMMAND">mv</B>的<CODECLASS="OPTION">-f</CODE>(<EM>强制</EM>)选项来避免用户的输入. 	      </P><P>当一个目录被移动到一个已存在的目录时, 那么它将成为目标目录的子目录.	      </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">mv source_directory target_directory</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">ls -lF target_directory</KBD><SAMPCLASS="COMPUTEROUTPUT">total 1 drwxrwxr-x    2 bozo  bozo      1024 May 28 19:20 source_directory/</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">rm</B></DT><DD><P>删除(清除)一个或多个文件. 			  <CODECLASS="OPTION">-f</CODE>选项将强制删除文件, 			  即使这个文件是只读的. 			  并且可以用来避免用户输入(在非交互脚本中使用).		  </P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><BCLASS="COMMAND">rm</B>将无法删除以破折号开头的文件. 		</P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT"

⌨️ 快捷键说明

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