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 ;
- 如果希望以追加的方式重定向到一个文件,则把“ > ”替换为“ >> ”。