shell输入输出和环境变量

时间:2021-11-20 15:34:37

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个文件描述符,但是正如我们在上表中所看到的, 012是标准输入、

输出和错误。可以任意使用文件描述符390是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。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,实际上我可以在49之间任意选择一个数字。下面的脚本只是从s t o c k . t x t文件中读了两行,然后把这两行回显出来。

该脚本的第一行把文件描述符4指定为标准输入,然后打开s t o c k . t x t文件。接下来两行的

作用是读入了两行文本。接着,作为标准输入的文件描述符4被关闭。最后,l i n e 1l 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 eexport 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表示没有错误,其他任何值表明有错