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 #!/bin/bash 2 # ex40.sh (burn-cd.sh) 3 # 自动刻录CDR的脚本. 4 5 6 SPEED=2 # 如果你的硬件支持的话, 你可以选用更高的速度. 7 IMAGEFILE=cdimage.iso 8 CONTENTSFILE=contents 9 DEVICE=cdrom 10 # DEVICE="0,0" 为了是用老版本的CDR 11 DEFAULTDIR=/opt # 这是包含需要被刻录内容的目录. 12 # 必须保证目录存在. 13 # 小练习: 测试一下目录是否存在. 14 15 # 使用 Joerg Schilling 的 "cdrecord" 包: 16 # http://www.fokus.fhg.de/usr/schilling/cdrecord.html 17 18 # 如果一般用户调用这个脚本的话, 可能需要root身份 19 #+ chmod u+s /usr/bin/cdrecord 20 # 当然, 这会产生安全漏洞, 虽然这是一个比较小的安全漏洞. 21 22 if [ -z "$1" ] 23 then 24 IMAGE_DIRECTORY=$DEFAULTDIR 25 # 如果命令行没指定的话, 那么这个就是默认目录. 26 else 27 IMAGE_DIRECTORY=$1 28 fi 29 30 # 创建一个"内容列表"文件. 31 ls -lRF $IMAGE_DIRECTORY > $IMAGE_DIRECTORY/$CONTENTSFILE 32 # "l" 选项将给出一个"长"文件列表. 33 # "R" 选项将使这个列表递归. 34 # "F" 选项将标记出文件类型 (比如: 目录是以 /结尾, 而可执行文件以 *结尾). 35 echo "Creating table of contents." 36 37 # 在烧录到CDR之前创建一个镜像文件. 38 mkisofs -r -o $IMAGEFILE $IMAGE_DIRECTORY 39 echo "Creating ISO9660 file system image ($IMAGEFILE)." 40 41 # 烧录CDR. 42 echo "Burning the disk." 43 echo "Please be patient, this will take a while." 44 cdrecord -v -isosize speed=$SPEED dev=$DEVICE $IMAGEFILE 45 46 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">></SPAN>或<SPANCLASS="TOKEN">>></SPAN>), 一般都是用来将多个文件连接起来. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 # Uses of 'cat' 2 cat filename # 打印出文件内容. 3 4 cat file.1 file.2 file.3 > 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 cat filename | tr a-z A-Z 2 3 tr a-z A-Z < filename # 效果相同, 但是处理更少, 4 #+ 并且连管道都省掉了. </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 cp -u source_dir/* dest_dir 2 # 把源目录"同步"到目标目录上, 3 #+ 也就是拷贝所有更新的文件和之前不存在的文件. </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 + -
显示快捷键?