跳到主要内容

Shell 输入输出

输出

在 Shell 脚本中,可以用几种不同的方式读入数据,可以使用标准输入(缺省为键盘),或者指定一个文件作为输入。

对于输出也一样,如果不指定某个文件作为输出,标准输出总是和终端屏幕相关联。如果所使用的命令出现了什么错误,它也会缺省输出到屏幕上,如果不想把这些信息输出到屏幕上,也可以把这些信息指定到一个文件中。

使用 echo 命令可以显示文本行或变量,或者把字符串输入到文件。它的一般形式如下:

echo string

echo 命令支持转义字符,比如:

  • 不换行:\c
  • 跳格:\t
  • 换行:\n
echo -e "hello\tworld\n"

输入

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

read var1 var2 ... ...

通常,我们希望在读取输入的同时给出一些提示信息:

read -p "Please input your name: " name

管道

UNIX 从来都不是为人机交互而设计的,而是为程序之间的交互而设计的。

上面这句话是 Unix 的一个设计哲学,我们通常也会想到 Unix 的另一个设计哲学——一个程序只做好一件事。

好啦,说那么多,其实都是为了引出“管道”的概念。在 Unix 中,程序可以被看成是过滤器,程序之间的交互就是输入和输出。Unix 从很早以前就提供了管道机制,使得一个程序的输出可以通过一根管子(管道)与另一个程序的输入联系起来。

管道在 Shell 中被广泛使用,可以用竖杠“ | ”表示。它的一般形式如下:

命令1 | 命令2

表示把命令1的输出通过管道传递给命令2作为输入。

举个栗子:我们先执行命令 ls,列出当前文件名,然后将结果送入管道中,进而 wc 从管道读出这些信息,并计算总共有几个单词:

$ ls | wc -w

重定向

下面再来扯一下标准输入、标准输出和错误输出,每个程序开始运行时都会默认打开这三个文件,其文件描述符(fd)分别为 0、1、2。

  • 标准输入(stdin)的文件描述符为0,它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出;
  • 标准输出(stdout)的文件描述符为1,它是命令的输出,缺省是屏幕,也可以是文件;
  • 标准错误(stderr)的文件描述符为2,它是命令的错误输出,缺省是屏幕,同样也可以是文件。

那我们怎么重新指定命令的标准输入、标准输出和错误输出呢?要实现这一点就需要使用文件重定向!

在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是 necessary。比如:

  • 把标准输出重定向到一个新文件:command 1 > file 或者 command > file ;
  • 把标准错误重定向到一个新文件:command 2 > file ;
  • 以 file 文件作为标准输入:command 0 < file ;
  • 如果希望以追加的方式重定向到一个文件,则把“ > ”替换为“ >> ”。