在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两个
变量所含有的内容被回显到屏幕上。

Shell编程学习---第五篇:Shell的输入和输出的更多相关文章

  1. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  2. shell编程学习之使用jq对json数据进行提取

    shell编程学习之使用jq对json提取 jq命令允许直接在命令行下对JSON进行操作,包括分片.过滤.转换等 ,jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上.预编译的二进制文件可以 ...

  3. shell编程系列15--文本处理三剑客之awk格式化输出printf

    shell编程系列15--文本处理三剑客之awk格式化输出printf printf的格式说明符 格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o ...

  4. shell编程学习笔记(五):Shell中脚本的参数

    在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...

  5. Shell高级编程学习笔记(基础篇)

    目录 1.shell脚本的执行方法  2.shell的变量类型  3.shell特殊变量 4.变量子串的常用操作  5.批量修改文件名实践   6.变量替换 7.在shell中计算字符串长度的方法  ...

  6. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  7. shell编程学习笔记【原创】

    本文为本人学习笔记,如有转载请注明出处,谢谢 一.Bourne Shell 有如下四种变量: 用户自定义变量 位置变量,即命令行参数 预定义变量 环境变量 二.位置变量 $ 与键入的命令行一样,包含脚 ...

  8. shell编程学习笔记(六):cat命令的使用

    这一篇不是讲shell编程的,专门讲cat命令.shell编程书用到了这个cat命令,顺便说一下cat命令. cat命令有多种用法,我一一来列举(以下蓝色字体部分为Linux命令,红色字体的内容为输出 ...

  9. shell编程学习笔记(一):编写我的第一段代码

    目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...

随机推荐

  1. .Net规则引擎Biztalk,Workflow和CKRule的比较

    微软的规则引擎   很多朋友会问,.Net平台有没有规则引擎?像Java就有很多的规则引擎,Drools,ILog都做得非常好,但.Net好像还没有哦.很多知道规则引擎,但不知道.Net的朋友都烦这个 ...

  2. warning

    warning:statement has no effect [-Wunused-value]| 未能赋值,常见错误:m==1/for(i=0;i++;i<m)/

  3. php header示例代码(推荐)

    <?php /*** Function: PHP header() examples (PHP) ** Desc: Some examples on how to use the header( ...

  4. nodejs的cs模式聊天客户端和服务器实现

    学习完nodejs的基础后,自然要写点东西练练手,以下是一个基于nodejs的cs模式的聊天软件代码: net模块是nodejs的网络编程必定用到的一个模块,对socket通信进行了封装 实现的功能: ...

  5. java.lang.StringBuffer源码分析

    StringBuffer是一个线程安全的可变序列的字符数组对象,它与StringBuilder一样,继承父类AbstractStringBuilder.在多线程环境中,当方法操作是必须被同步,Stri ...

  6. head 头标签(转发)

    HTML head 头标签 paddingme | 04 Oct 2014 HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商 ...

  7. SQL获取数据库中表的列名和列类型

    select column_name as [字段名],data_type as [数据类型] from information_schema.columns where table_name='表名 ...

  8. 更改git bash默认的路径

    更改git bash默认的路径   在打开git bash时,每次都是在C:\Uer路径下,每次都需要先用cd命令转换到自己需要工作的路径(cd  /f/dss).修改打开git bash 时的默认的 ...

  9. 转:jQuery.fn.extend与jQuery.extend到底区别在哪?

    还是先吐个槽,网上都都是转载抄袭,基本上就那么一两篇文章,说的还不清楚.... 正文: 其实说白了,从两个方法本身就能看出来端倪. 我们先把jQuery看成了一个类,这样好理解一些. jQuery.e ...

  10. Anagrams问题

    #include<stdio.h> #include<string.h> int main() { int i; ],word2[]; //分别用于存储输入的两个单词 int ...