1、shell输入与输出

在shell脚本中,可以用几种不同的方式读入数据:可以使用标准输入—缺省为键盘,或 者指定一个文件作为输入。对于输出也是一样:如果不指定某个文件作为输出,标准输出总 是和终端屏幕相关联。如果所使用命令出现了什么错误,它也会缺省输出到屏幕上,如果不 想把这些信息输出到屏幕上,也可以把这些信息指定到一个文件中。

1.1 echo的使用

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

echo string

echo命令有很多功能,其中最常用的是下面几个:

\c   不换行。 
\f   进纸。 
\t   跳格。 
\n   换行。

必须使用- n选项来禁止echo命令输出后换行,必须使用-e选项才能使转义符生效。
如果想把一个字符串输出到文件中,使用重定向符号 >。或者可以使用重定向符号>>追加到一个文件的末尾,这意味着不覆盖原有的内容:
在下面的例子中一个字符串被重定向到一个名为myfile的文件中:

$ echo "The log files have all been done"> myfile

1.2 read的使用

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

read varible1 varible2 ...

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

read name sname
echo $name $sname

1.3 管道的使用

可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠 |表示。它的一 般形式为:
命令1 | 命令2
sed、awk和grep都很适合用管道,特别是在简单的一行命令中。在下面的例子中, who命令的输出通过管道传递给awk命令,以便只显示用户名和所在的终端。
如果你希望列出系统中所有的文件系统,可以使用管道把 df命令的输出传递给 a wk命令, awk显示出其中的第一列。你还可以再次使用管道把 awk的结果传递给grep命令,去掉最上面的题头filesystem。

df -k | awk '{print $1}' |grep -v "filesystem"
/dev/vda1
devtmpfs
tmpfs
tmpfs
tmpfs
tmpfs

1.4 tee命令的使用

tee命令作用可以用字母 T来形象地表示。它把输出的一个副本输送到标准输出,另一个 副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了。
它的一般形式为:

tee -a files
其中,- a表示追加到文件末尾

输入文件—标准输入 0
输出文件—标准输出 1
错误输出文件—标准错误 2
标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。
标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。
标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。

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 <&- 把关闭标准输入