知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

linux shell编程指南第十四章------环境和shell变量

发布时间:2014-09-05 13:35:09作者:知识屋

为使s h e l l编程更有效,系统提供了一些s h e l l变量。s h e l l变量可以保存诸如路径名、文件
名或者一个数字这样的变量名。s h e l l将其中任何设置都看做文本字符串。
有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊

变量,它用于向s h e l l脚本传递参数。

使用e c h o命令可以显示单个变量取值,并在变量名前加$,例如:

[root@localhost huangcd]# great_picture="die hard"
[root@localhost huangcd]# echo ${great_picture}}
die hard}
[root@localhost huangcd]# echo ${great_picture}
die hard

[root@localhost huangcd]# last_file=ok.txt
[root@localhost huangcd]# echo ${last_file}
ok.txt

使用u n s e t命令清除变量。

[root@localhost huangcd]# pc=enterprise
[root@localhost huangcd]# echo 4{pc}
4{pc}
[root@localhost huangcd]# echo ${pc}
enterprise
[root@localhost huangcd]# unset pc
[root@localhost huangcd]# echo 4{pc}
4{pc}
[root@localhost huangcd]# echo ${pc}


使用s e t命令显示所有本地定义的s h e l l变量。

[root@localhost huangcd]# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS.xterm

将变量并排可以使变量结合在一起:

[root@localhost huangcd]# first="bruce"
[root@localhost huangcd]# sum=willis
[root@localhost huangcd]# echo 4{first}${sum}
4{first}willis
[root@localhost huangcd]# echo ${first}${sum}
brucewillis

有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命
令格式为:
$ { v a r i a b l e : - v a l u e }
意即如果设置了变量值,则使用它,如果未设置,则取新值。例如:

[root@localhost huangcd]# color=blue
[root@localhost huangcd]# echo "the sky is ${color:-grey}"
the sky is blue
[root@localhost huangcd]# unset color
[root@localhost huangcd]# echo "the sky is ${color:-grey}"
the sky is grey

可以用变量保存系统命令参数的替换信息。下面的例子使用变量保存文件拷贝的文件名
信息。变量s o u r c e保存p a s s w d文件的路径,d e s t保存c p命令中文件目标。

[root@localhost huangcd]# source="/etc/passwd"
[root@localhost huangcd]# dest="/tmp/passwd.bak"
[root@localhost huangcd]# cp ${source} ${dest}

如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人
想要改变它,则返回错误信息。格式如下:
v a r i a b l e - n a m e = v a l u e
readonly variable-name

下面的例子中,设置变量为系统磁带设备之一的设备路径,将之设为只读,任何改变其值的操作将返回错误信息。

[root@localhost huangcd]# tape_dev="/dev/rmt/0n"
[root@localhost huangcd]# echo ${tape_dev}
/dev/rmt/0n
[root@localhost huangcd]# readonly tape_dev
[root@localhost huangcd]# tape_dev="/dev/rmt/ln"
bash: tape_dev: readonly variable

要查看所有只读变量,使用命令r e a d o n l y即可。

[root@localhost huangcd]# readonly
declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")'
declare -ir EUID="0"
declare -ir PPID="4931"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"
declare -r tape_dev="/dev/rmt/0n"

环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。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命令导出。
环境变量与本地变量设置方式相同。

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

显示环境变量与显示本地变量一样,例子如下:

[root@localhost huangcd]# console=tty1
[root@localhost huangcd]# export console
[root@localhost huangcd]# echo $console
tty1

使用e n v命令可以查看所有的环境变量。

[root@localhost huangcd]# env
SSH_AGENT_PID=4599
HOSTNAME=localhost.localdomain
DESKTOP_STARTUP_ID=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000

使用u n s e t命令清除环境变量:

[root@localhost huangcd]# echo $console
tty1
[root@localhost huangcd]# unset console
[root@localhost huangcd]# echo $console


Brourne shell 有一些预留的环境变量名,这些变量名不能用作其他用途。通常在
/ e t c / p r o f i l e中建立这些嵌入的环境变量,但也不完全是,这取决于用户自己。

下面为一些常用的环境变量:

[root@localhost huangcd]# echo $HOME
/root
[root@localhost huangcd]# echo $IFS


[root@localhost huangcd]# echo $LOGNAME
root
[root@localhost huangcd]# echo $MAILPATH


[root@localhost huangcd]# echo $SHELL
/bin/bash

还有一些预留的环境变量。其他系统或命令行应用将用到它们。以下是最常用的一些,
注意这些值均未有缺省设置,必须显示说明。

1. EDITO R
设置编辑器,最常用。
$ EDITOR=vi ;export EDITOR
2. PWD
当前目录路径名,用c d命令设置此选项。
3. PA G E R
保存屏幕翻页命令,如p g、m o r e,在查看m a n文本时用到此功能。
$ PAGER='pg -f -p%;d'export PAGER
4. MANPAT H

保存系统上m a n文本的目录。目录间用冒号分隔。
$ MANPATH=/usr/apps/man:/usr/local;/emxapnort MANPATH
5. LPDEST或P R I N T E R
保存缺省打印机名,用于打印作业时指定打印机名。
$ LPDEST=hp3si-systems

本章开始提到有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 Yo u S e e T h e F u l l M o o n

[root@localhost huangcd]# cat param
#!/bin/bash
#param
echo "This is the script name :$0"
echo "This is the script name :$1"
echo "This is the script name :$2"
echo "This is the script name :$3"
echo "This is the script name :$4"
[root@localhost huangcd]# ./param did you see the full moon
This is the script name :./param
This is the script name :did
This is the script name :you
This is the script name :see
This is the script name :the

[root@localhost huangcd]# cat param2
#!/bin/bash
echo "Hello world this is `basename $0` calling"
[root@localhost huangcd]# ./param2
Hello world this is param2 calling

可以在脚本中向系统命令传递参数。下面的例子中,在f i n d命令里,使用$ 1参数指定查
找文件名。

[root@localhost huangcd]# cat findfile
#!/bin/bash
#find
find / -name $1 -print
[root@localhost huangcd]# sh findfile passwd
/usr/lib/news/bin/auth/passwd
/usr/share/doc/nss_ldap-253/pam.d/passwd
/usr/bin/passwd
/etc/passwd
/etc/pam.d/passwd

既然已经知道了如何访问和使用s h e l l脚本中的参数,多知道一点相关信息也是很有用的,
有必要知道脚本运行时的一些相关控制信息,这就是特定变量的由来。共有7个特定变量,见
表1 4 - 2。


[root@localhost huangcd]# cat param
#!/bin/bash
#param
echo "This is the script name :$0"
echo "This is the script name :$1"
echo "This is the script name :$2"
echo "This is the script name :$3"
echo "This is the script name :$4"
echo "the number of param is :$#"
echo "show all arguments :$*"
[root@localhost huangcd]# sh param today is very blue
This is the script name :param
This is the script name :today
This is the script name :is
This is the script name :very
This is the script name :blue
the number of param is :4
show all arguments :today is very blue

注意,$ ?返回0。可以在任何命令或脚本中返回此变量以获得返回信息。基于此信息,可
以在脚本中做更进一步的研究,返回0意味着成功,1为出现错误。
下面的例子拷贝文件到/ t m p,并使用$ ?检查结果。

[root@localhost huangcd]# cp ok.txt /tmp
[root@localhost huangcd]# echo $?
0

现在尝试将一个文件拷入一个不存在的目录:

[root@localhost huangcd]# cp ok.txt /usr/local/apps/dsf
cp: 无法创建一般文件“/usr/local/apps/dsf”: 没有那个文件或目录
[root@localhost huangcd]# echo $?
1

(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜