Shell编程学习---第五篇:Shell的输入和输出

Shell脚本基础
本文介绍了Shell脚本的基础知识,包括如何使用echo、read、cat等命令处理文本输入输出,以及如何利用管道、重定向和文件描述符进行数据流的控制。
在shell脚本中,可以用几种不同的方式读入数据:可以使用标准输入—缺省为键盘,或
者指定一个文件作为输入。对于输出也是一样:如果不指定某个文件作为输出,标准输出总
是和终端屏幕相关联。如果所使用命令出现了什么错误,它也会缺省输出到屏幕上,如果不
想把这些信息输出到屏幕上,也可以把这些信息指定到一个文件中。
大多数使用标准输入的命令都指定一个文件作为标准输入。如果能够从一个文件中读取
数据,何必要费时费力地从键盘输入呢?
本章我们将讨论以下内容:
•  使用标准输入、标准输出及标准错误。
•  重定向标准输入和标准输出。

5.1 echo
使用etho命令可以显示文本行或变量,或者把字符串输入到文件。它的一般形式为:
echo string
etho命令有很多功能,其中最常用的是下面几个:
\c  不换行。
\f  进纸。
\t  跳格。
\n  换行。
如果想把一个字符串输出到文件中,使用重定向符号 >
$ echo "The log files have all been done" > myfile

或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容
$ echo " The log fils have all been done again" >> myfile

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

$echo "\"dev/rmt0"\"


5.2 read
可以使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只
指定了一个变量,那么read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回
车。
它的一般形式为:
read varible1 varible2 ...
在下面的例子中,只指定了一个变量,它将被赋予直至回车之前的所有内容:
$read  name
Hello I am superman
$echo $name
Hello I am superman

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

cat命令最有用的选项就是:
-v  显示控制字符
如果希望显示名为myfile的文件,可以用:
$ cat myfile
如果希望显示myfile1 myfile2 myfile3这三个文件,可以用:
$ cat myfile1 myfile2 myfile3
如果希望创建一个名为bigfile的文件,该文件包含上述三个文件的内容,可以把上面命令
的输出重定向到新文件中:
$ cat myfile1 myfile2 myfile3 > bigfile
如果希望创建一个新文件,并向其中输入一些内容,只需使用cat命令把标准输出重定向
到该文件中,这时cat命令的输入是标准输入 — 键盘,你输入一些文字,输入完毕后按
<ctl+D>结束输入。这真是一个非常简单的文字编辑器!
$cat myfile
this is great
<CRL +D>
$pg myfile
this is gread

5.4 管道
可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠 |表示。它的一
般形式为:
命令1 | 命令2
其中|是管道符号。
在下面的例子中,在当前目录中执行文件列表操作,如果没有管道的话,所有文件就会
显示出来。当shell看到管道符号以后,就会把所有列出的文件交给管道右边的命令,因此管
道的含义正如它的名字所暗示的那样:把信息从一端传送到另外一端。在这个例子中,接下
来grep命令在文件列表中搜索 file.doc:
$ls | grep file.doc

sed awk和grep都很适合用管道,特别是在简单的一行命令中。在下面的例子中, who命
令的输出通过管道传递给 awk命令,以便只显示用户名和所在的终端。
$who | awk '{print $1"\t"$2}'
matthew pts/0
louise  pts/0

如果你希望列出系统中所有的文件系统,可以使用管道把df命令的输出传递给awk命令,
awk显示出其中的第一列。你还可以再次使用管道把awk的结果传递给grep命令,去掉最上面
的题头filesystem。
$df -k | awk '{print $1}' | grep -v "Filesystem"


5.5 tee
tee命令作用可以用字母 T来形象地表示。它把输出的一个副本输送到标准输出,另一个
副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,那么这个命
令再合适不过了。
它的一般形式为:
tee -a files
其中,-a表示追加到文件末尾。
当执行某些命令或脚本时,如果希望把输出保存下来,tee命令非常方便。

5.6 标准输入、输出和错误
当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描
述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。
下面就是这些文件描述符及它们通常所对应的文件名:
      文 件                     文件描述符
   输入文件—标准输入                0
   输出文件—标准输出                1
   错误输出文件—标准错误            2
系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、
输出和错误。可以任意使用文件描述符 3到9。

标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出

标准输出是文件描述符 1。它是命令的输出,缺省是屏幕,也可以是文件

标准错误是文件描述符 2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。你可
能会问,为什么会有一个专门针对错误的特殊文件?这是由于很多人喜欢把错误单独保存到
一个文件中,特别是在处理大的数据文件时,可能会产生很多错误。
如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说
是你的终端) 。

5.7 文件重定向
在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件
重定向
在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,
这不是必需的。为了完整起见,我们在表 5 - 1中列出了两种方法。
表5-1  常用文件重定向命令
command > filename                             把标准输出重定向到一个新文件中
command >> filename                           把标准输出重定向到一个文件中 (追加)
command 1 > fielname                          把标准输出重定向到一个文件中
command > filename 2>&1                   把标准输出和标准错误一起重定向到一个文件中
command 2 > filename                          把标准错误重定向到一个文件中
command 2 >> filename                        把标准输出重定向到一个文件中 (追加)
command >> filename 2>&1                 把标准输出和标准错误一起重定向到一个文件中 (追加)
command < filename >filename2         把command命令以filename文件作为标准输入,以filename2文件作为标准输出
command < filename                              把command命令以filename文件作为标准输入
command << delimiter                            把从标准输入中读入,直至遇到 delimiter 分界符
command <&m                                        把文件描述符 m作为标准输入
command >&m                                        把标准输出重定向到文件描述符 m中
command <&-                                          把关闭标准输入

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

5.7.2  重定向标准输入
可以指定命令的标准输入。在awk一章就会遇到这样的情况。下面给出一个这样的例子:
$ sort < name.txt
在上面的命令中, s o r t命令的输入是采用重定向的方式给出的,不过也可以直接把相应的
文件作为该命令的参数:
$ sort name.txt
在上面的例子中,还可以更进一步地通过重定向为 s o r t 命令指定一个输出文件 n a m e . o u t。
这样屏幕上将不会出现任何信息 ( 除了错误信息以外 ):
$ sort <name.txt >name.out
在发送邮件时,可以用重定向的方法发送一个文件中的内容。在下面的例子中,用户
louise将收到一个邮件,其中含有文件contents.txt中的内容:
$ mail louise < contents.txt
重定向操作符command << delimiter是一种非常有用的命令,通常都被称为“此处”文挡。
我们将在本书后面的章节深入讨论这一问题。现在只介绍它的功能。shell将分界符delimiter之
后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符,shell就知道输
入结束了。这一命令对于自动或远程的例程非常有用。可以任意定义分界符delimiter,最常见
的是EOF.

5.8 exec
exec命令可以用来替代当前shell;换句话说,并没有启动子shell.使用这一命令时任何现
有环境都将会被清除,并重新启动一个 shell.它的一般形式为:
exec command
其中的command通常是一个shell脚本。
我所能够想像得出的描述exec命令最贴切的说法就是:它践踏了你当前的shell。
当这个脚本结束时,相应的会话可能就结束了。exec命令的一个常见用法就是在用户
的. profile 最后执行时,用它来执行一些用于增强安全性的脚本。如果用户的输入无效,该
shell将被关闭,然后重新回到登录提示符。 exec还常常被用来通过文件描述符打开文件。
记住,exec在对文件描述符进行操作的时候(也只有在这时) ,它不会覆盖你当前的
shell。

5.9  使用文件描述符
可以使用exec命令通过文件描述符打开和关闭文件。在下面的例子中,我选用了文件描
述符4,实际上我可以在 4到9之间任意选择一个数字。下面的脚本只是从 stock.txt文件中读了
两行,然后把这两行回显出来。
该脚本的第一行把文件描述符 4指定为标准输入,然后打开stock.txt文件。接下来两行的
作用是读入了两行文本。接着,作为标准输入的文件描述符 4被关闭。最后,line1和line2两个
变量所含有的内容被回显到屏幕上。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

max_min_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值