shell学习系列(四).输入输出
时间:2007-08-04 来源:scutan
在shell脚本中,可以用几种不同的方式读入数据:可以使用标准输入,缺省为键盘,或者指定一个文件
作为输入.对于输出也是一样,如果不指定某个文件作为输出,标准输出问题和终端屏幕相关联,也可以
把信息指定到一个文件中.
1.echo
使用echo命令可以显示文本行或变量,或者把字符串输入到文件.它的一般形式为:
echo string
echo命令有很多功能,其中最常用的是下面几个:
\c 不换行
\t 跳格
\n 换行
如果是Linux系统,那么必须使用-n选项来禁止echo命令后换行:
必须使用-e选项才能使转义符生效.
如果希望在echo命令输出之后附加换行,可以使用\n选项.
如果想把一个字符串输出到文件中,使用重定向符号>.
引号是一个特殊的字符,所以必须要使用反斜杠\来使shell忽略它的特殊意义.假设希望使用echo 命令输出这样的字符串: "/dev/rmt0", 那么只要在引号前面加上反斜杠就可以了:
echo "\"/dev/rmt0\""
2.read
可以使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量.如果只指定了一 个变量,那么read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车.
它的一般形式为:
read varible1 varible2
在下面的例子中,只指定了一个变量 ,它将被赋予直至回车之前的所有内容.
read name
hello i am a man
echo $name
hello i am a man
在下面的例子中,给出了两个变量,它们分别被赋予名字和姓氏,shell将用空格作为变量之间的分 隔符.
read name surname
john doe
echo $name $surname
john doe
如果文本域过长,shell将所有的超长部分赋予最后一个变量.
3.cat
cat是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用它来显示控制字符. 在使用cat命令时要注意,它不会在文件分页符处停下来.它会一下显示完整个文件.如果希望每次显示 一页,可以使用more命令或把cat命令的输出通过管道传递到另外一个具有分页功能的命令中.
cat myfile | more
cat命令的一般形式为:
cat [options] filename1 ... filename2
cat命令最有用的选项就是:
-v显示控制字符.
如果希望显示myfile1, myfile2, myfile3这三个文件,可以用:
cat myfile1 myfile2 myfile3
如果希望创建一个名为bigfile的文件,该文件包含上述三个文件的内容,可以把上面命令的输出 重定向到新文件中:
cat myfile1 myfile2 myfile3 > bigfile
4.管道
可以通过管道把一个命令的输出传递给另一个命令作为输入,管道用竖杠|表示,它的一般形式为:
命令1|命令2
5.tee
tee命令作用可以用字母T来形象地表示,它把输出的一个副本输送到标准输出,另一个副本拷贝到 相应的文件中.如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了.
它的一般形式为:
tee -a files
其中-a表示追加到文件末尾
在执行某些命令或脚本时,如果希望把输出保留下来,tee命令非常方便.
who | tee who.out
就将who的结果显示给标准输出,同时保存到who.out文件中.
如:
who | tee who.out | awk '{print $1"\t"$2}' | tee -a who.out
6.标准输入,输出和错误
6.1标准输入
标准输入是文件描述符0,它是命令的输入,缺省是键盘,也可以是文件或其它命令的输出.
6.2标准输出
标准输出是文件描述符1,它是命令的输出,缺省是屏幕,也可以是文件.
6.3标准错误
标准错误是文件描述符2,这是命令错误的输出,缺省是屏幕,同样也可以是文件.
7.文件重定向
在执行命令时,可以指定命令的标准输入,输出和错误,要实现这一点就需要使用文件重定向,在对 标准错误进行重定向时,必须要使用文件描述符.但是对于标准输入和输出来说,这不是必需的.
command > filename 把标准输出重定向到一个新文件中
command >> filename 把标准输出重定向到一个新文件中(追加)
command 1> filename 把标准输出重定向到一个文件中
command > filename 2>&1 把标准输出和标准错误重定向到一个文件中
command 2>filename 把标准错误重定向到一个文件中
command 2>> filename 把标准错误重定向到一个文件中(追加)
command >> filename 2>&1 把标准输出和标准错误重定向到一个文件中(追加)
command < filename > filename2以filename文件作为标准输入,以filename2文件作为标准输出
command < filename 以filename文件作为标准输入
command << delimiter 从标准输入中读入,直到遇到delimiter分界符
command <&m 把文件描述符m作为标准输入
command >&m 把标准输出重定向到文件描述符m中
command <&- 关闭标准入
7.1 重定向标准输出
在下面的命令中,把/etc/passwd文件中的用户ID域按照用户名排列,该命令的输出重定向到 sort.out文件中,要提醒注意的是,在使用sort命令的时候,重定向符号一定要离开sort命令两个空格, 否则该命令会把它当作输入文件.
cat passwd | awk -F: '{print $1}' | sort 1>sort.out
可以把很多命令的输出追回到同一个文件中.
ls -l | grep ^d >> file.out
如果希望把标准输出重定向到文件中,可以用>filename.如果希望追加到已有的文件中,那么可以 使用>>filename.如果想创建一个长度为0的空文件,可以用>filename.
7.2 重定向标准输入
可以指定命令的标准输入.
sort < name.txt
在上面的命令中,sort命令的输入是采用重定向的方式给出的.不过也可以直接把相应的文件作为 该命令的参数.
sort name.txt
在发送邮件的时候,可以用重定向的方法发送一个文件中的内容,如:
mail louise < contents.txt
重定向操作符command << delimiter是一种非常有用的命令,通过都被称为"此处"文档.shell将 分界符delimiter之后直至下一个同样的分界符之前的所有内容作为输入,遇到下一个分界符,shell就 知道输入结束了.这一命令对于自动或远程的例程非常有用.可以用任意定义分界符delimiter,最常见 的是EOF.
7.3 重定向标准错误
为了重定向标准错误,可以指定文件描述符2.如:
grep "trident" missiles 2> /dev/null
8.结合使用标准输出和标准错误
一个快速发现错误的方法就是,先将输出重定向到一个文件中,然后再把标准错误重定向到另外一 个文件中.下面给出一个例子:
在审计文件时,其中一个的确存在,而且包含一些信息,而另一个由于某种原因已经不存在了,想把 这两个文件合并到accounts.out文件中.
cat account_qtr.doc account_end.doc 1> accounts.out 2>accoutns.err
现在如果出现了错误相应的错误将会保存在accounts.err文件中.
9.合并标准输出和标准错误
在合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令的.
cleanup > cleanup.out 2>&1
在上面的例子中,将cleanup脚本的输出重定向到cleanup.out文件中,而且其错误也被重定向到相 同的文件中.
10.exec
exec命令可以用来替代当前shell,换句话说,并没有启动子shell.使用这一命令时任何现有的环 境将会被清除,并重新启动一个shell,它的一般形式为:
shell command
其中的command通常是一个shell脚本.
当这个脚本结束时,相应的会话就可能结束了.exec在对文件描述符进行操作的时候,它不会覆盖 当前的shell.
11.使用文件描述符
可以使用exec命令通过文件描述符打开和关闭文件,在下面的例子中.选用了文件描述符4,下面的 脚本只是从stock.txt文件中读了两行,然后把这两行回显出来.
该脚本的第一行把文件描述符4指定为标准输入,然后打开stock.txt文件,接下来两行的作用是读 入了两行文本,接着,作为标准输入的文件描述符4被关闭.最后line1和line2两个变量所含有的内容都 被回显到屏幕上.
#!/bin/sh
exec 4<&0 0<stock.txt
read line1
read line2
exec 0<&4
echo $line1
echo $line2
1.echo
使用echo命令可以显示文本行或变量,或者把字符串输入到文件.它的一般形式为:
echo string
echo命令有很多功能,其中最常用的是下面几个:
\c 不换行
\t 跳格
\n 换行
如果是Linux系统,那么必须使用-n选项来禁止echo命令后换行:
必须使用-e选项才能使转义符生效.
如果希望在echo命令输出之后附加换行,可以使用\n选项.
如果想把一个字符串输出到文件中,使用重定向符号>.
引号是一个特殊的字符,所以必须要使用反斜杠\来使shell忽略它的特殊意义.假设希望使用echo 命令输出这样的字符串: "/dev/rmt0", 那么只要在引号前面加上反斜杠就可以了:
echo "\"/dev/rmt0\""
2.read
可以使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量.如果只指定了一 个变量,那么read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车.
它的一般形式为:
read varible1 varible2
在下面的例子中,只指定了一个变量 ,它将被赋予直至回车之前的所有内容.
read name
hello i am a man
echo $name
hello i am a man
在下面的例子中,给出了两个变量,它们分别被赋予名字和姓氏,shell将用空格作为变量之间的分 隔符.
read name surname
john doe
echo $name $surname
john doe
如果文本域过长,shell将所有的超长部分赋予最后一个变量.
3.cat
cat是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用它来显示控制字符. 在使用cat命令时要注意,它不会在文件分页符处停下来.它会一下显示完整个文件.如果希望每次显示 一页,可以使用more命令或把cat命令的输出通过管道传递到另外一个具有分页功能的命令中.
cat myfile | more
cat命令的一般形式为:
cat [options] filename1 ... filename2
cat命令最有用的选项就是:
-v显示控制字符.
如果希望显示myfile1, myfile2, myfile3这三个文件,可以用:
cat myfile1 myfile2 myfile3
如果希望创建一个名为bigfile的文件,该文件包含上述三个文件的内容,可以把上面命令的输出 重定向到新文件中:
cat myfile1 myfile2 myfile3 > bigfile
4.管道
可以通过管道把一个命令的输出传递给另一个命令作为输入,管道用竖杠|表示,它的一般形式为:
命令1|命令2
5.tee
tee命令作用可以用字母T来形象地表示,它把输出的一个副本输送到标准输出,另一个副本拷贝到 相应的文件中.如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了.
它的一般形式为:
tee -a files
其中-a表示追加到文件末尾
在执行某些命令或脚本时,如果希望把输出保留下来,tee命令非常方便.
who | tee who.out
就将who的结果显示给标准输出,同时保存到who.out文件中.
如:
who | tee who.out | awk '{print $1"\t"$2}' | tee -a who.out
6.标准输入,输出和错误
6.1标准输入
标准输入是文件描述符0,它是命令的输入,缺省是键盘,也可以是文件或其它命令的输出.
6.2标准输出
标准输出是文件描述符1,它是命令的输出,缺省是屏幕,也可以是文件.
6.3标准错误
标准错误是文件描述符2,这是命令错误的输出,缺省是屏幕,同样也可以是文件.
7.文件重定向
在执行命令时,可以指定命令的标准输入,输出和错误,要实现这一点就需要使用文件重定向,在对 标准错误进行重定向时,必须要使用文件描述符.但是对于标准输入和输出来说,这不是必需的.
command > filename 把标准输出重定向到一个新文件中
command >> filename 把标准输出重定向到一个新文件中(追加)
command 1> filename 把标准输出重定向到一个文件中
command > filename 2>&1 把标准输出和标准错误重定向到一个文件中
command 2>filename 把标准错误重定向到一个文件中
command 2>> filename 把标准错误重定向到一个文件中(追加)
command >> filename 2>&1 把标准输出和标准错误重定向到一个文件中(追加)
command < filename > filename2以filename文件作为标准输入,以filename2文件作为标准输出
command < filename 以filename文件作为标准输入
command << delimiter 从标准输入中读入,直到遇到delimiter分界符
command <&m 把文件描述符m作为标准输入
command >&m 把标准输出重定向到文件描述符m中
command <&- 关闭标准入
7.1 重定向标准输出
在下面的命令中,把/etc/passwd文件中的用户ID域按照用户名排列,该命令的输出重定向到 sort.out文件中,要提醒注意的是,在使用sort命令的时候,重定向符号一定要离开sort命令两个空格, 否则该命令会把它当作输入文件.
cat passwd | awk -F: '{print $1}' | sort 1>sort.out
可以把很多命令的输出追回到同一个文件中.
ls -l | grep ^d >> file.out
如果希望把标准输出重定向到文件中,可以用>filename.如果希望追加到已有的文件中,那么可以 使用>>filename.如果想创建一个长度为0的空文件,可以用>filename.
7.2 重定向标准输入
可以指定命令的标准输入.
sort < name.txt
在上面的命令中,sort命令的输入是采用重定向的方式给出的.不过也可以直接把相应的文件作为 该命令的参数.
sort name.txt
在发送邮件的时候,可以用重定向的方法发送一个文件中的内容,如:
mail louise < contents.txt
重定向操作符command << delimiter是一种非常有用的命令,通过都被称为"此处"文档.shell将 分界符delimiter之后直至下一个同样的分界符之前的所有内容作为输入,遇到下一个分界符,shell就 知道输入结束了.这一命令对于自动或远程的例程非常有用.可以用任意定义分界符delimiter,最常见 的是EOF.
7.3 重定向标准错误
为了重定向标准错误,可以指定文件描述符2.如:
grep "trident" missiles 2> /dev/null
8.结合使用标准输出和标准错误
一个快速发现错误的方法就是,先将输出重定向到一个文件中,然后再把标准错误重定向到另外一 个文件中.下面给出一个例子:
在审计文件时,其中一个的确存在,而且包含一些信息,而另一个由于某种原因已经不存在了,想把 这两个文件合并到accounts.out文件中.
cat account_qtr.doc account_end.doc 1> accounts.out 2>accoutns.err
现在如果出现了错误相应的错误将会保存在accounts.err文件中.
9.合并标准输出和标准错误
在合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令的.
cleanup > cleanup.out 2>&1
在上面的例子中,将cleanup脚本的输出重定向到cleanup.out文件中,而且其错误也被重定向到相 同的文件中.
10.exec
exec命令可以用来替代当前shell,换句话说,并没有启动子shell.使用这一命令时任何现有的环 境将会被清除,并重新启动一个shell,它的一般形式为:
shell command
其中的command通常是一个shell脚本.
当这个脚本结束时,相应的会话就可能结束了.exec在对文件描述符进行操作的时候,它不会覆盖 当前的shell.
11.使用文件描述符
可以使用exec命令通过文件描述符打开和关闭文件,在下面的例子中.选用了文件描述符4,下面的 脚本只是从stock.txt文件中读了两行,然后把这两行回显出来.
该脚本的第一行把文件描述符4指定为标准输入,然后打开stock.txt文件,接下来两行的作用是读 入了两行文本,接着,作为标准输入的文件描述符4被关闭.最后line1和line2两个变量所含有的内容都 被回显到屏幕上.
#!/bin/sh
exec 4<&0 0<stock.txt
read line1
read line2
exec 0<&4
echo $line1
echo $line2
相关阅读 更多 +