linux shell编程指南第十四章------环境和shell变量
2013-12-06 14:00
253 查看
为使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脚本传递参数。
什么是shell变量:
变量可以定制用户本身的工作环境。使用变量可以保存有用信息,使系统获知用户相关
设置。变量也用于保存暂时信息。例如:一变量为E D I TO R,系统中有许多编辑工具,但哪一
个适用于系统呢?将此编辑器名称赋给E D I TO R,这样,在使用c r o n或其他需要编辑器的应用
时,这就是你将一直使用的E D I TO R取值,并将之用作缺省编辑器。
下面是一个例子,登录的审核系统需要编辑。在菜单中选择此选项时,应用查询E D I TO R
变量值,其值为v i。系统知道可使用此编辑器。
另一个例子需要登录数据库系统,键入下列命令:
$ isql -Udavet -Pabcd -Smethsys
这里- S为正在连接的服务器名称。有一变量D S Q U E RY保存服务器名称值。设置服务器名
称值到D S Q U E RY变量,这样如果登录时不使用- S提供服务器名称,应用将查询D S Q U E RY变
量,并使用其取值作为服务器名称。需要做的全部工作就是键入下列命令:
$ isql -Udavet -Pabcd
本地变量:
本地变量在用户现在的s h e l l生命期的脚本中使用。例如,本地变量f i l e - n a m e取值为
l o o p . d o c,这个值只在用户当前s h e l l生命期有意义。如果在s h e l l中启动另一个进程或退出,此
值将无效。这个方法的优点就是用户不能对其他的s h e l l或进程设置此变量有效。
表1 4 - 1列出各种实际变量模式
使用变量时,如果用花括号将之括起来,可以防止s h e l l误解变量值,尽管不必一定要这
样做,但这确实可用。
要设置一本地变量,格式为:
$ variable-name=valu或e $ { v a r i a b l e - n a m e = v a l u e }
注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。s h e l l变量可以
用大小写字母。
表14-1 变量设置时的不同模式
Va r i a b l e - n a m e = v a l u e 设置实际值到v a r i a b l e - n a m e
Va r i a b l e - n a m e + v a l u e 如果设置了v a r i a b l e - n a m e,则重设其值
Va r i a b l e - n a m e : ? v a l u e 如果未设置v a r i a b l e - n a m e,显示未定义用户错误信息
Va r i a b l e - n a m e ? v a l u e 如果未设置v a r i a b l e - n a m e,显示系统错误信息
Va r i a b l e - n a m e : = v a l u e 如果未设置v a r i a b l e - n a m e,设置其值
Va r i a b l e - n a m e : - v a l u e 同上,但是取值并不设置到v a r i a b l e - n a m e,可以被替换
显示变量:
使用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
可以结合使用变量,下面将错误信息和环境变量L O G N A M E设置到变量e r r o r- m s g。
[root@localhost ~]# ERROR_MSG="Sorry this file does not exist user $LOGNAME"
[root@localhost ~]# echo ${ERROR_MSG}
Sorry this file does not exist user root
使用u n s e t命令清除变量。
[root@localhost huangcd]# pc=enterprise
[root@localhost huangcd]# echo ${pc}
enterprise
[root@localhost huangcd]# unset 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
上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:
$ { v a r i a b l e : = v a l u e }
测试变量是否取值,如果未设置,则返回一空串。方法如下:
$ { v a r i a b l e : + v a l u e }
使用下述方法初始化变量为空字符串。
v a r i a b l e = " "
$ D E T I N A T I O N = " "
使用变量来保存系统命令参数:
可以用变量保存系统命令参数的替换信息。下面的例子使用变量保存文件拷贝的文件名
信息。变量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/0
[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
嵌入shell变量:
Brourne shell 有一些预留的环境变量名,这些变量名不能用作其他用途。通常在
/ e t c / p r o f i l e中建立这些嵌入的环境变量,但也不完全是,这取决于用户自己。以下是嵌入s h e l l
变量列表。
改变目录路径变量,保留一系列由冒号隔开的路径名,用于c d命令。如果设置了C D PAT H,
c d一个目录时,首先查找C D PAT H,如果C D PAT H指明此目录,则此目录成为当前工作目录。
例子如下:
$ CDPATH=:/home/dave/bin:/usr/local;/aepxppsort CDPATH.
如果要
$ cd apps
c d命令首先在C D PAT H中查找目录列表,如果发现a p p s,则它成为当前工作目录。
E X I N I T变量保存使用v i编辑器时的初始化选项。例如,调用v i时,要显示行号,且在第
1 0个空格加入t a b键,命令为:
$ EXINIT='set nu tab=10';export EXINIT
I F S用作s h e l l指定的缺省域分隔符。原理上讲域分隔符可以是任意字符,但缺省通常为空
格、新行或t a b键。I F S在分隔文件或变量中各域时很有用。下面的例子将I F S设置为冒号,然
后echo PAT H变量,给出一个目录分隔开来的可读性很强的路径列表。
[root@localhost ~]# export IFS=:
[root@localhost ~]# echo $PATH
/usr/kerberos/sbin /usr/kerberos/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /usr/X11R6/bin $/sbin /root/bin sbin $/sbin
[root@localhost ~]# IFS=
[root@localhost ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:$/sbin:/root/bin:sbin:$/sbin
LOGNAME此变量保存登录名,应该为缺省设置,但如果没有设置,可使用下面命令完成它:
[root@localhost ~]# echo $LOGNAME
root
[root@localhost ~]# LOGNAME="HUANGCHENGUD";export LOGNAME
[root@localhost ~]# echo $LOGNAME
HUANGCHENGUD
M A I L变量保存邮箱路径名,缺省为/var/spool/mail/<login name>。s h e l l周期性检查新邮
件,如果有了新邮件,在命令行会出现一个提示信息。如果邮箱并不在以上指定位置,可以
用M A I L设置。
$ MAIL=/usr/mail/dave;export MAIL
M A I L C H E C K缺省每6 0 s检查新邮件,但如果不想如此频繁检查新邮件,比如设为每2 m,
使用命令:
$ MAILCHECK=120;export MAILCHECK
PAT H变量保存进行命令或脚本查找的目录顺序,正确排列这个次序很重要,可以在执行
命令时节省时间。你一定不想在已知命令不存在的目录下去查找它。通常情况,最好首先放
在H O M E目录下,接下来是从最常用到一般使用到不常用的目录列表次序。如果要在当前工
作目录下查询,无论在哪儿,均可以使用句点操作。目录间用冒号分隔,例如:
$ PATH=$HOME/bin:.:/bin:/usr/bin;export PATH
使用上面的例子首先查找H O M E / b i n目录,然后是当前工作目录,然后是/ b i n,最后是
/ u s r / b i n。
PAT H可以在系统目录下/ e t c / p r o f i l e中设置,也可以使用下面方法加入自己的查找目录。
$ PATH=$PATH:/$HOME/bi;n:.export PATH
这里使用了/ e t c / p r o f i l e中定义的PAT H,并加入$ H O M E / b i n和当前工作目录。一般来说,
在查找路径开始使用当前工作目录不是一个好办法,这样很容易被其他用户发现。
PS1基本提示符包含s h e l l提示符,缺省对超级用户为#,其他为$。可以使用任何符号作提示符,以下为两个例子:
[root@localhost huangcd]# echo $PS1
[\u@\h \W]\$
[root@localhost huangcd]# PS1="->";export PS1
->
->PS1=[\u@\h \W]\$
bash: W]$: command not found
->PS1="[\u@\h \W]\$";export PS1
P S 2为附属提示符,缺省为符号> 。P S 2用于执行多行命令或超过一行的一个命令。
[root@localhost huangcd]$echo $PS2
>
[root@localhost huangcd]$PS2="&&&";export PS2
[root@localhost huangcd]$echo $PS2
&&&
S H E L L变量保存缺省s h e l l,通常在/ e t c / p a s s w d中已设置,但是如有必要使用另一个s h e l l,
可以用如下方法覆盖当前s h e l l:
[root@localhost huangcd]$echo $SHELL
/bin/bash
T E R M变量保存终端类型。设置T E R M使应用获知终端对屏幕和键盘响应的控制序列类型,
常用的有v t 1 0 0、v t 2 0 0、v t 2 2 0 - 8等。
[root@localhost huangcd]$echo $TERM
xterm
还有一些预留的环境变量。其他系统或命令行应用将用到它们。以下是最常用的一些,
注意这些值均未有缺省设置,必须显示说明。
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
set命令:
在$ H O M E . p r o f i l e文件中设置环境变量时,还有另一种方法导出这些变量。使用s e t命令- a
选项,即set -a指明所有变量直接被导出。不要在/ e t c / p r o f i l e中使用这种方法,最好只在自己
的$ H O M E . p r o f i l e文件中使用。
不可以将变量从子进程导出到文进程。
位置变量参数:
本章开始提到有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
这里只传递6个参数,7、8、9参数为空,正像预计的那样。注意,第一个参数表示脚本
名,当从脚本中处置错误信息时,此参数有很大作用。
下面的例子返回脚本名称。注意$ 0返回当前目录路径,如果只返回脚本名,在b a s e n a m e命令下参数设为$ 0,刚好得
到脚本名字。
[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
名或者一个数字这样的变量名。s h e l l将其中任何设置都看做文本字符串。
有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊
变量,它用于向s h e l l脚本传递参数。
什么是shell变量:
变量可以定制用户本身的工作环境。使用变量可以保存有用信息,使系统获知用户相关
设置。变量也用于保存暂时信息。例如:一变量为E D I TO R,系统中有许多编辑工具,但哪一
个适用于系统呢?将此编辑器名称赋给E D I TO R,这样,在使用c r o n或其他需要编辑器的应用
时,这就是你将一直使用的E D I TO R取值,并将之用作缺省编辑器。
下面是一个例子,登录的审核系统需要编辑。在菜单中选择此选项时,应用查询E D I TO R
变量值,其值为v i。系统知道可使用此编辑器。
另一个例子需要登录数据库系统,键入下列命令:
$ isql -Udavet -Pabcd -Smethsys
这里- S为正在连接的服务器名称。有一变量D S Q U E RY保存服务器名称值。设置服务器名
称值到D S Q U E RY变量,这样如果登录时不使用- S提供服务器名称,应用将查询D S Q U E RY变
量,并使用其取值作为服务器名称。需要做的全部工作就是键入下列命令:
$ isql -Udavet -Pabcd
本地变量:
本地变量在用户现在的s h e l l生命期的脚本中使用。例如,本地变量f i l e - n a m e取值为
l o o p . d o c,这个值只在用户当前s h e l l生命期有意义。如果在s h e l l中启动另一个进程或退出,此
值将无效。这个方法的优点就是用户不能对其他的s h e l l或进程设置此变量有效。
表1 4 - 1列出各种实际变量模式
使用变量时,如果用花括号将之括起来,可以防止s h e l l误解变量值,尽管不必一定要这
样做,但这确实可用。
要设置一本地变量,格式为:
$ variable-name=valu或e $ { v a r i a b l e - n a m e = v a l u e }
注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。s h e l l变量可以
用大小写字母。
表14-1 变量设置时的不同模式
Va r i a b l e - n a m e = v a l u e 设置实际值到v a r i a b l e - n a m e
Va r i a b l e - n a m e + v a l u e 如果设置了v a r i a b l e - n a m e,则重设其值
Va r i a b l e - n a m e : ? v a l u e 如果未设置v a r i a b l e - n a m e,显示未定义用户错误信息
Va r i a b l e - n a m e ? v a l u e 如果未设置v a r i a b l e - n a m e,显示系统错误信息
Va r i a b l e - n a m e : = v a l u e 如果未设置v a r i a b l e - n a m e,设置其值
Va r i a b l e - n a m e : - v a l u e 同上,但是取值并不设置到v a r i a b l e - n a m e,可以被替换
显示变量:
使用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
可以结合使用变量,下面将错误信息和环境变量L O G N A M E设置到变量e r r o r- m s g。
[root@localhost ~]# ERROR_MSG="Sorry this file does not exist user $LOGNAME"
[root@localhost ~]# echo ${ERROR_MSG}
Sorry this file does not exist user root
使用u n s e t命令清除变量。
[root@localhost huangcd]# pc=enterprise
[root@localhost huangcd]# echo ${pc}
enterprise
[root@localhost huangcd]# unset 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
上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:
$ { v a r i a b l e : = v a l u e }
测试变量是否取值,如果未设置,则返回一空串。方法如下:
$ { v a r i a b l e : + v a l u e }
使用下述方法初始化变量为空字符串。
v a r i a b l e = " "
$ D E T I N A T I O N = " "
使用变量来保存系统命令参数:
可以用变量保存系统命令参数的替换信息。下面的例子使用变量保存文件拷贝的文件名
信息。变量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/0
[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
嵌入shell变量:
Brourne shell 有一些预留的环境变量名,这些变量名不能用作其他用途。通常在
/ e t c / p r o f i l e中建立这些嵌入的环境变量,但也不完全是,这取决于用户自己。以下是嵌入s h e l l
变量列表。
改变目录路径变量,保留一系列由冒号隔开的路径名,用于c d命令。如果设置了C D PAT H,
c d一个目录时,首先查找C D PAT H,如果C D PAT H指明此目录,则此目录成为当前工作目录。
例子如下:
$ CDPATH=:/home/dave/bin:/usr/local;/aepxppsort CDPATH.
如果要
$ cd apps
c d命令首先在C D PAT H中查找目录列表,如果发现a p p s,则它成为当前工作目录。
E X I N I T变量保存使用v i编辑器时的初始化选项。例如,调用v i时,要显示行号,且在第
1 0个空格加入t a b键,命令为:
$ EXINIT='set nu tab=10';export EXINIT
I F S用作s h e l l指定的缺省域分隔符。原理上讲域分隔符可以是任意字符,但缺省通常为空
格、新行或t a b键。I F S在分隔文件或变量中各域时很有用。下面的例子将I F S设置为冒号,然
后echo PAT H变量,给出一个目录分隔开来的可读性很强的路径列表。
[root@localhost ~]# export IFS=:
[root@localhost ~]# echo $PATH
/usr/kerberos/sbin /usr/kerberos/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /usr/X11R6/bin $/sbin /root/bin sbin $/sbin
[root@localhost ~]# IFS=
[root@localhost ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:$/sbin:/root/bin:sbin:$/sbin
LOGNAME此变量保存登录名,应该为缺省设置,但如果没有设置,可使用下面命令完成它:
[root@localhost ~]# echo $LOGNAME
root
[root@localhost ~]# LOGNAME="HUANGCHENGUD";export LOGNAME
[root@localhost ~]# echo $LOGNAME
HUANGCHENGUD
M A I L变量保存邮箱路径名,缺省为/var/spool/mail/<login name>。s h e l l周期性检查新邮
件,如果有了新邮件,在命令行会出现一个提示信息。如果邮箱并不在以上指定位置,可以
用M A I L设置。
$ MAIL=/usr/mail/dave;export MAIL
M A I L C H E C K缺省每6 0 s检查新邮件,但如果不想如此频繁检查新邮件,比如设为每2 m,
使用命令:
$ MAILCHECK=120;export MAILCHECK
PAT H变量保存进行命令或脚本查找的目录顺序,正确排列这个次序很重要,可以在执行
命令时节省时间。你一定不想在已知命令不存在的目录下去查找它。通常情况,最好首先放
在H O M E目录下,接下来是从最常用到一般使用到不常用的目录列表次序。如果要在当前工
作目录下查询,无论在哪儿,均可以使用句点操作。目录间用冒号分隔,例如:
$ PATH=$HOME/bin:.:/bin:/usr/bin;export PATH
使用上面的例子首先查找H O M E / b i n目录,然后是当前工作目录,然后是/ b i n,最后是
/ u s r / b i n。
PAT H可以在系统目录下/ e t c / p r o f i l e中设置,也可以使用下面方法加入自己的查找目录。
$ PATH=$PATH:/$HOME/bi;n:.export PATH
这里使用了/ e t c / p r o f i l e中定义的PAT H,并加入$ H O M E / b i n和当前工作目录。一般来说,
在查找路径开始使用当前工作目录不是一个好办法,这样很容易被其他用户发现。
PS1基本提示符包含s h e l l提示符,缺省对超级用户为#,其他为$。可以使用任何符号作提示符,以下为两个例子:
[root@localhost huangcd]# echo $PS1
[\u@\h \W]\$
[root@localhost huangcd]# PS1="->";export PS1
->
->PS1=[\u@\h \W]\$
bash: W]$: command not found
->PS1="[\u@\h \W]\$";export PS1
P S 2为附属提示符,缺省为符号> 。P S 2用于执行多行命令或超过一行的一个命令。
[root@localhost huangcd]$echo $PS2
>
[root@localhost huangcd]$PS2="&&&";export PS2
[root@localhost huangcd]$echo $PS2
&&&
S H E L L变量保存缺省s h e l l,通常在/ e t c / p a s s w d中已设置,但是如有必要使用另一个s h e l l,
可以用如下方法覆盖当前s h e l l:
[root@localhost huangcd]$echo $SHELL
/bin/bash
T E R M变量保存终端类型。设置T E R M使应用获知终端对屏幕和键盘响应的控制序列类型,
常用的有v t 1 0 0、v t 2 0 0、v t 2 2 0 - 8等。
[root@localhost huangcd]$echo $TERM
xterm
还有一些预留的环境变量。其他系统或命令行应用将用到它们。以下是最常用的一些,
注意这些值均未有缺省设置,必须显示说明。
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
set命令:
在$ H O M E . p r o f i l e文件中设置环境变量时,还有另一种方法导出这些变量。使用s e t命令- a
选项,即set -a指明所有变量直接被导出。不要在/ e t c / p r o f i l e中使用这种方法,最好只在自己
的$ H O M E . p r o f i l e文件中使用。
不可以将变量从子进程导出到文进程。
位置变量参数:
本章开始提到有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
这里只传递6个参数,7、8、9参数为空,正像预计的那样。注意,第一个参数表示脚本
名,当从脚本中处置错误信息时,此参数有很大作用。
下面的例子返回脚本名称。注意$ 0返回当前目录路径,如果只返回脚本名,在b a s e n a m e命令下参数设为$ 0,刚好得
到脚本名字。
[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
相关文章推荐
- 全新 Mac 安装指南(编程篇)(环境变量、Shell 终端、SSH 远程连接)
- linux shell编程指南第五章------shell输入与输出1
- linux shell编程基础 系统环境变量 PATH PS1
- linux shell编程指南第二十六章------shell 工具1
- 第九章:可编程的shell,shell变量和环境:编写自己的shell
- linux shell编程指南第二十六章------shell 工具
- shell编程之环境变量配置文件(4)
- shell编程之环境变量
- Shell编程之环境变量配置文件
- Shell编程基础之环境变量
- linux shell编程指南第五章------shell输入与输出
- Shell编程之环境变量配置文件
- linux shell编程指南第十九章------shell 函数1
- Linux Shell编程(二)--Shell变量及相关操作
- 全新 Mac 安装指南(编程篇)(环境变量、Shell 终端、SSH 远程连接)
- 高级shell脚本编程之重定向、环境变量、shell函数、echo命令用法
- linux之基础shell脚本编程4 字符串操作,变量赋值,配置用户环境
- linux shell编程1 - 环境与变量
- linux shell编程指南第十三章------登录环境
- linux shell编程之利用环境变量IFS自定义分隔符