分享

《shell编程指南》读书笔记(二)——通配符,标准输入,输出及重定向

 happy123god 2013-01-10
本节主要讲述文件搜索时使用的通配符,标准输入,输出及重定向,命令的执行顺序。
 
 
第四章 文件名置换

* 匹配文件名中的任何字符串,包括空字符串。
? 匹配文件名中的任何单个字符。
[...] 匹配[ ]中所包含的任何字符。
[!...] 匹配[ ]中非感叹号!之后的字符。
 
*也可用在文件名模式的开头,在下面的例子中,*.doc匹配所有以.doc结尾的文件名:
$ ls *.doc
accounts.doc  qtr_end.doc

在下面的例子中,f??*s匹配所有以f开头,中间是任意两个字符,后面跟随任意字符串,
并以s结尾的文件名:
      $ ls f??*s
      ftpaccess  ftpconversion
      ftpgroups  ftphosts
      ftpusers

使用[...]可以用来匹配方括号[]中的任何字符。在这一方法中,还可以使用一个横杠-来
连接两个字母或数字,以此来表示一个范围。在下面的例子中,列出了以i或o开头的文件名:
      $ ls [io]*
      inetd.conf  initrunlvl
      inputrc     issue
      info-dir    inittab
      ioctl.save  issue.net


第五章 shell输入与输出

5.1 echo

初涉shell的用户常常会遇到的一个问题就是如何把双引号包含到echo命令的字符串中。
引号是一个特殊字符,所以必须要使用反斜杠\来使shell忽略它的特殊含义。假设你希望使用
echo命令输出这样的字符串:“/dev/rmt0”,那么我们只要在引号前面加上反斜杠\即可:
$ echo "\"/dev/rmt0"\"
"/dev/rmt0"


5.2 read

可以使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只
指定了一个变量,那么read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回
车。
它的一般形式为:
read varible1 varible2 ...

在下面的例子中,我们给出了两个变量,它们分别被赋予名字和姓氏。shell将用空格作
为变量之间的分隔符:

$ read name surname
John Doe
$ echo $name $surname
John Doe

如果输入文本域过长, Shell 将所有的超长部分赋予最后一个变量。下面的例子,假定要
读取变量名字和姓,但这次输入三个名字,结果如下;
$ read name surname
John Lemon Doe
$ echo $name
John
$ echo $surname
Lemon Doe

在上面的例子中,如果我们输入字符串John Lemon Doe,那么第一个单词将被赋给第一
个变量,而由于变量数少于单词数,字符串后面的部分将被全部赋给第二个变量。


5.3 cat

cat是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用它来显示
控制字符。在使用cat命令时要注意,它不会在文件分页符处停下来;它会一下显示完整个文
件(比如使用man命令查看manual文档)。如果希望每次显示一页,可以使用more命令或把
cat命令的输出通过管道传递到另外一个具有分页功能的命令中,请看下面的例子:
$ cat myfile | more

cat命令的一般形式为:
cat [options] filename1 ... filename2 ...
cat命令最有用的选项就是:
-v 显示控制字符
如果希望显示名为myfile的文件,可以用:
$ cat myfile
如果希望显示myfile1、myfile2、myfile3这三个文件,可以用:
$ cat myfile1 myfile2 myfile3

5.4 cat

tee命令作用可以用字母T来形象地表示。它把输出的一个副本输送到标准输出,另一个
副本拷贝到相应的文件中。

$ who | tee who.out
louise  pts/1  May 20 12:58 (193.132.90.9)
matthew pts/0  May 20 10:18 (193.132.90.1)

$ cat who.out
louise  pts/1  May 20 12:58 (193.132.90.9)
matthew pts/0  May 20 10:18 (193.132.90.1)



5.5 标准输入,输出及错误


当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描
述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。
下面就是这些文件描述符及它们通常所对应的文件名:

文件                          文件描述符
输入文件—标准输入                  0
输出文件—标准输出                  1
错误输出文件——标准错误              2
系统中实际上有12个文件描述符,但是正如我们在上表中所看到的,0、1、2是标准输入、
输出和错误。可以任意使用文件描述符3到9。


5.6 文件重定向


在执行命令时,可以利用文件重定向指定命令的标准输入、输出和错误。


command > filename 2>&1 

可以这样看:先将标准输出定向到了filename文件,然后通过2>&1将标准错误
重定向到了标准输出,而标准输出已经被定向到了filename文件,所以就是
”把标准输出和标准错误一起重定向到一个文件中“。

command >> filename 2>&1  把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename        把command命令以filename文件作为标准输入
command << delimiter      把从标准输入中读入,直至遇到delimiter分界符
command <&m               把文件描述符m作为标准输入
command >&m               把标准输出重定向到文件描述符m中
command <&-               把关闭标准输入


让我们来看一个标准输出的例子。在下面的命令中,把/etc/passwd文件中的用户ID域按
照用户命排列。该命令的输出重定向到sort.out文件中。要提醒注意的是,在使用sort命令的时
候(或其他含有相似输入文件参数的命令),重定向符号一定要离开sort命令两个空格,否则该
命令会把它当作输入文件。
$ cat passwd | awk -F: '{print $1}' | sort 1>sort.out

在合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令的。下面给出
一个例子:
$ cleanup >cleanup.out 2>&1
在上面的例子中,我们将cleanup脚本的输出重定向到cleanup.out文件中,而且其错误也
被重定向到相同的文件中。

5.7 exec命令

exec命令可以用来替代当前shell;换句话说,并没有启动子shell。使用这一命令时任何现
有环境都将会被清除,并重新启动一个shell。它的一般形式为:
exec command
其中的command通常是一个shell脚本。


5.8 文件描述符

可以使用exec命令通过文件描述符打开和关闭文件。

该脚本的第一行把文件描述符4指定为标准输入,然后打开stock.txt文件。接下来两行的
作用是读入了两行文本。接着,作为标准输入的文件描述符4被关闭。最后,line1和line2两个
变量所含有的内容被回显到屏幕上。

    $ pg f_desc
    #!/bin/sh
    # f_desc
    exec 4<&0 0<stock.txt
    read line1
    read line2
    exec 0<&4
    echo $line1
    echo $line2





第六章 命令执行顺序

6.1 使用&&

使用&&的一般形式为:
命令1 && 命令2
这种命令执行方式相当地直接。&&左边的命令(命令1)返回真(即返回0,成功被执行)
后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执
行这个命令”

示例:
$ mv /apps/bin /apps/dev/bin && rm -r /apps/bin
在上面的例子中,/apps/bin目录将会被移到/apps/dev/bin目录下,如果它没有被成功执行,
就不会删除/apps/bin目录。

6.2 使用||

使用||的一般形式为:
命令1 || 命令2

||的作用有一些不同。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令
(命令2);或者换句话说,“如果这个命令执行失败了,那么就执行这个命令”。
如果命令1执行成功,则命令2不后被执行。

6.3 命令组合:()和{}

为了在当前shell中执行一组命令,可以用命令分隔符隔开每一个命令,并把所有的命令
用圆括号()括起来。
它的一般形式为:
(命令1;命令2;. . .)

如果使用{ }来代替(),那么相应的命令将在子shell而不是当前shell中作为一个整体被执
行,只有在{ }中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子shell中执
行,否则在当前shell执行。它的一般形式为:
{命令1;命令2;. . . }



欢迎转载,转载请注明地址: http://www.360doc.com/showWeb/0/0/259318360.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多