1 第5章 shell的输入和输出
1.1 shell的输出echo
使用e c h o命令可以显示文本行或变量,或者把字符串输入到文件。它的一般形式为:
echo string
1.2 e c h o命令有很多功能,其中最常用的是下面几个:
\c 不换行。\f 进纸。\t 跳格。\n 换行。
1.3 如果是LINUX系统,那么......
必须使用- n选项来禁止echo命令输出后换行:
(续)
$ echo -n "What is your name :"
必须使用-e选项才能使转义符生效
echo –e “here is a tab\there are two tabs\t\tok”
1.4 shell的输入read
可以使用r e a d语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只
指定了一个变量,那么r e a d将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车。
它的一般形式为:read varible1 varible2 ...
1.5 cat的使用
c a t是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用它来显示
控制字符。在使用c a t命令时要注意,它不会在文件分页符处停下来;它会一下显示完整个文件。如果希望每次显示一页,可以使用m o r e命令或把c a t命令的输出通过管道传递到另外一个具有分页功能的命令中,请看下面的例子:
如果希望创建一个新文件,并向其中输入一些内容,只需使用c a t命令把标准输出重定向
到该文件中,这时c a t命令的输入是标准输入—键盘,你输入一些文字,输入完毕后按
< C T R L - D >结束输入
1.6 管道
可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一
般形式为:
命令1 |命令2
其中|是管道符号。
你没准还会希望只显示出其中的分区名,不显示/ d e v /部分,这没问题;我们只要
在后面简单地加上另一个管道符号和相应的s e d命令即可。
df –k | awk ‘{print $1}’ | grep –v “Filesystem” | sed s ‘/\/dev\//g’
1.7 tee命令
t e e命令作用可以用字母T来形象地表示。它把输出的一个副本输送到标准输出,另一个
副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,那么这个命
令再合适不过了。
它的一般形式为:tee -a files 其中,- a表示追加到文件末尾。
下面我们来看一个例子,我们使用w h o命令,结果输出到屏幕上,同时保存在who.out文件中:
1.8 标准输入、输出和错误
当我们在s h e l l中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描
述符来引用这些文件。由于文件描述符不容易记忆, s h e l l同时也给出了相应的文件名。
下面就是这些文件描述符及它们通常所对应的文件名:
文件 |
文件描述符 |
输入文件—标准输入 |
0 |
输出文件—标准输出 |
1 |
错误输出文件—标准错误 |
2 |
系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、
输出和错误。可以任意使用文件描述符3到9。0是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。1是命令的输出,缺省是屏幕,也可以是文件。2是命令错误的输出,缺省是屏幕,同样也可以是文件。你可
能会问,为什么会有一个专门针对错误的特殊文件?这是由于很多人喜欢把错误单独保存到
一个文件中,特别是在处理大的数据文件时,可能会产生很多错误。
如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说
是你的终端)。
1.9 文件重定向
在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件
重定向。表5 - 1列出了最常用的重定向组合,并给出了相应的文件描述符。
在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,
这不是必需的。为了完整起见,我们在表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文件作为标准输入,以filename 2文件 |
command < filename |
把command命令以filename文件作为标准输入 |
command << delimiter |
把从标准输入中读入,直至遇到delimiter分界符 |
command <&m |
把文件描述符m作为标准输入 |
command >&m |
把把标准输出重定向到文件描述符m中 |
command <&- |
把关闭标准输入 |
1.10 exec
e x e c命令可以用来替代当前s h e l l;换句话说,并没有启动子s h e l l。使用这一命令时任何现有环境都将会被清除,并重新启动一个s h e l l。它的一般形式为:
exec command
其中的c o m m a n d通常是一个s h e l l脚本。
我所能够想像得出的描述e x e c命令最贴切的说法就是:它践踏了你当前的s h e l l。
当这个脚本结束时,相应的会话可能就结束了。e x e c命令的一个常见用法就是在用户
的. p r o f i l e最后执行时,用它来执行一些用于增强安全性的脚本。如果用户的输入无效,该s h e l l将被关闭,然后重新回到登录提示符。e x e c还常常被用来通过文件描述符打开文件。
记住, e x e c在对文件描述符进行操作的时候(也只有在这时),它不会覆盖你当前的
s h e l l。
1.11 使用文件描述符
可以使用e x e c命令通过文件描述符打开和关闭文件。在下面的例子中,我选用了文件描
述符4,实际上我可以在4到9之间任意选择一个数字。下面的脚本只是从s t o c k . t x t文件中读了两行,然后把这两行回显出来。
该脚本的第一行把文件描述符4指定为标准输入,然后打开s t o c k . t x t文件。接下来两行的
作用是读入了两行文本。接着,作为标准输入的文件描述符4被关闭。最后,l i n e 1和l i n e 2两个变量所含有的内容被回显到屏幕上
vi f_desc
#!/bin/sh
# f_desc
exec 4<&0 0<stock.txt
read line1
read line2
exec 0<&4
echo $line1
echo $line2
2 第14章环境和shell变量
2.1 本地变量
本地变量在用户现在的s h e l l生命期的脚本中使用。例如,本地变量file-name取值为
loop.doc,这个值只在用户当前shell生命期有意义。如果在shell中启动另一个进程或退出,此
值将无效。这个方法的优点就是用户不能对其他的s h e l l或进程设置此变量有效。
表1 4 - 1列出各种实际变量模式
使用变量时,如果用花括号将之括起来,可以防止s h e l l误解变量值,尽管不必一定要这
样做,但这确实可用。
要设置一本地变量,格式为:
$ variable-name=value或 $ { variable-name = value }
注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。s h e l l变量可以
用大小写字母。
表14-1 变量设置时的不同模式
variable-name =value |
设置实际值到variable-name |
variable-name + value |
如果设置了variable-name,则重设其值 |
variable-name: ? value |
如果未设置variable-name,显示未定义用户错误信息 |
variable-name? value |
如果未设置variable-name,显示系统错误信息 |
variable-name : =value |
如果未设置variable-name,设置其值 |
variable-name : - value |
同上,但是取值并不设置到variable-name,可以被替换 |
2.2 显示变量
使用e c h o命令可以显示单个变量取值,并在变量名前加$,例如:
DOLLAR=99
Echo ${DOLLAR}
2.3 清除变量
使用u n s e t命令清除变量。unset variable-name
PC=enterprise
Echo ${PC}
unset PC
echo ${PC}
2.4 显示所有本地shell变量
使用s e t命令显示所有本地定义的s h e l l变量。
2.5 设置只读变量
如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人
想要改变它,则返回错误信息。格式如下:
v a r i a b l e - n a m e = v a l u e
readonly variable-name
下面的例子中,设置变量为系统磁带设备之一的设备路径,将之设为只读,任何改变其
值的操作将返回错误信息。
要查看所有只读变量,使用命令r e a d o n l y即可。
2.6 环境变量
环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。s h e l l中执行的用
户进程均称为子进程。不像本地变量(只用于现在的s h e l l)环境变量可用于所有子进程,这包括编辑器、脚本和应用。
环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在. p r o f i l e文件中
定义。系统管理员可能在/ e t c / p r o f i l e文件中已经设置了一些环境变量。将之放入p r o f i l e文件意味着每次登录时这些值都将被初始化。
传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用e x p o r t命令导出。
环境变量与本地变量设置方式相同。
2.7 设置环境变量
V A R I A B L E - N A M E = v a l u e;export VARIABLE-NAME
在两个命令之间是一个分号,也可以这样写:
V A R I A B L E - N A M E = v a l u e
Export VARIABLE-NAME
2.8 显示环境变量
显示环境变量与显示本地变量一样,例子如下:
CONSOLE=tty1;export CONSOLE
echo $CONSOLE
使用e n v命令可以查看所有的环境变量。
2.9 位置变量参数
本章开始提到有4种变量,本地、环境,还有两种变量被认为是特殊变量,因为它们是只
读的。这两种变量即为位置变量和特定变量参数。先来看一看位置变量。
如果要向一个s h e l l脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚
本,此数目可以任意多,但只有前9个可以被访问,使用s h i f t命令可以改变这个限制。本书后面将讲到s h i f t命令。参数从第一个开始,在第9个结束;每个访问参数前要加$符号。第一个参数为0,表示预留保存实际脚本名字。无论脚本是否有参数,此值均可用。
如果向脚本传送Did You See Th e Full Mo o n信息,下面的表格讲解了如何访问每一个参
数。
$ 0 |
$1 |
$2 |
$3 |
$4 |
$5 |
$6 |
$7 |
$8 |
$9 |
脚本名字 |
Did |
you |
see |
the |
Full |
moon |
|
|
|
2.10 特定变量参数
既然已经知道了如何访问和使用s h e l l脚本中的参数,多知道一点相关信息也是很有用的,
有必要知道脚本运行时的一些相关控制信息,这就是特定变量的由来。共有7个特定变量,见表14-2 特定s h e l l变量
$ # |
传递到脚本的参数个数 |
$ * |
以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个 |
$ ! |
后台运行的最后一个进程的进程I D号 |
$ $ |
脚本运行的当前进程I D号 |
$ @ |
与$ #相同,但是使用时加引号,并在引号中返回每个参数 |
$ - |
显示s h e l l使用的当前选项,与s e t命令功能相同 |
$ ? |
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错 |