随笔 - 56, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

《LInux与Unix Shell编程指南》笔记之环境与Shell变量

                                 环境与shell变量
                                 点击打开本章pdf文档
    本地变量
    本地变量在用户现在的shell生命期的脚本使用。例如一个本地变量LOCAL_VAL。这个值只在用户当前shell生命期
有意义。如果在shell中启动另一个进程或退出,此值将无效。这个方法的有点是用户不能对其他的shell或进程设置此
变量有效。
    设置变量格式为:
    variable-name=value 或 ${variable-name=value}
    等号两边可以有空格,如果value中有空格,那么这个value要用双引号括起来。
    
                变量设置时的不同模式
    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,可以被替换    
    a、显示变量
    [root@localhost ~]# DOLLAR=99
    [root@localhost 
~]# echo ${DOLLAR}
    
99
    b、结合变量
    将变量并排可以使变量结合在一起。
    [root@localhost ~]# FIRST="Bruce "
    [root@localhost 
~]# SURNAME="Willis"
    [root@localhost 
~]# echo ${FIRST}${SURNAME}
    Bruce Willis
    c、清除变量
    使用unset命令清除变量。
    unset variable-name    
    d、测试变量是否已经设置
    如果未设置或初始化,就可以使用另一值。格式为:
    ${variable:-value}
    意思就是说如果设置了就使用这个设置了的值,如果没有设置,那么用-value。例如:
    [root@localhost ~]# COLOUR=blue
    [root@localhost 
~]# echo "The sky is ${COLOUR:-grey} today."
    The sky 
is blue today.
    在这里COLOUR已经设置为blue,所以显示出来,下面清除这个值,然后测试:
    [root@localhost ~]# unset COLOUR
    [root@localhost 
~]# echo "The sky is ${COLOUR:-grey} today."
    The sky 
is grey today.
    也可以编写脚本测试变量是否取值,然后返回带有系统错误信息的结果。例如,下面测试变量file是否取值:
    [root@localhost ~]# echo "The file is ${FILES:?}"
    bash: FILES: parameter 
null or not set
    或者修改为:
    [root@localhost ~]# echo "The file is ${FILES:? "sorry cannot local the variable"}"
    bash: FILES:  sorry cannot local the variable
    e、使用变量来保存系统命令参数
    下面的例子使用变量保存文件拷贝的文件名:
    [root@localhost ~]# SOURCE=".C/sh_test"
    [root@localhost 
~]# DEST="./D/sh_test"
    [root@localhost 
~]# cp ${SOURCE} ${DEST}
    [root@localhost 
~]# cd D
    [root@localhost D]# ls
    sh_test
    f、设置只读变量
    如果设置变量时,不想再改变其值,可以将之设置为只读方式,如:
    [root@localhost D]# TAPE_DEV="TAPE_DEV_1"
    [root@localhost D]# echo TAPE_DEV_1
    TAPE_DEV_1
    [root@localhost D]# 
readonly TAPE_DEV
    [root@localhost D]# TAPE_DEV
="TAPE_DEV_2"
    bash: TAPE_DEV: 
readonly variable
    g、显示所有本地shell变量
    使用set命令,如:
    [root@localhost D]# set
    BASH
=/bin/bash
    BASH_ARGC
=()
    BASH_ARGV
=()
    ... ...  
    
    环境变量
    环境变量用于所有用户进程(经常称为子进程)。登录进程成为父进程。shell中执行的用户进程均成为子进程。不
像本地变量(只用于现在的shell)环境变量可用于所有子进程。用户注销时这些值将丢失。环境变量应用于用户进程时,
必须用export命令导出。环境变量与本地变量设置方式相同。
    a、设置和显示环境变量:
    [root@localhost D]# echo $CONSOLE
    [root@localhost D]# CONSOLE
=tty1;export CONSOLE
    [root@localhost D]# echo $CONSOLE
    tty1
    b、显示所有环境变量
    [root@localhost D]# env
    SSH_AGENT_PID
=3851
    CONSOLE
=tty1
    HOSTNAME
=localhost.localdomain
    c、清除命令跟清除本地变量一样
   
    嵌入shell变量
    预留的环境变量名,这些变量名不能用作其他用途。列举一下嵌入变量列表:
    1、CDPATH
    改变目录路径,用于cd命令,如果设置了CDPATH,cd一个目录时,首先查找CDPATH,如果CDPATH指明了该目录,
则此目录成为当前工作目录。如目录E在/root/C/E,那么应该设置为:
    [root@localhost /]# CDPATH=:root/C;export CDPATH
    [root@localhost 
/]# cd E
    
/root/C/E
    [root@localhost E]# 
    观察最后一行的目录为E。
    可以添加多个目录,用“:“号分开,如:
    [root@localhost /]# CDPATH=:root/C:root/D;export CDPATH
    2、EXINIT
    保存vi编辑器时的初始化选项。例如,调用vi时,要显示行号,命令为:
    [root@localhost E]# EXINIT='set nu';export EXINIT
    然后打开vi编辑器后会看到行号了。
    3、HOME
    用cd命令进入:
    [root@localhost root]# HOME=/home/balu;export HOME
    [root@localhost root]# pwd
    
/root
    [root@localhost root]# cd
    [root@localhost 
~]# pwd
    
/home/balu
    4、LOGNAME
    此变量保存登录名,一般为缺省值,但也可以设置:
    [root@localhost /]# echo $LOGNAME
    root
    [root@localhost 
/]# LOGNAME="zzc";export LOGNAME
    [root@localhost 
/]# echo $LOGNAME
    zzc
    5、MAIL
    变量保存邮箱路径名,如:
    [root@localhost /]# echo $MAIL
    
/var/spool/mail/root
    6、MAILCHECK
    缺省每60s检查新邮件,如:
    [root@localhost /]# echo $MAILCHECK
    
60
    可以设置为每2分钟检查一次,命令为:
    [root@localhost /]# MAILCHECK=120;export MAILCHECK
    [root@localhost 
/]# echo $MAILCHECK
    
120
    7、PATH
    保存进行命令或脚本查找的目录顺序,如:
    $PATH=$HOME/bin:.:/bin:/usr/bin;export PATH
    上面顺序为首先查找HOME/bin目录,然后当前目录,然后是/bin,最后是/usr/bin。
    8、PS1
    基本提示符包含shell提示符,缺省对超级用户为#,其他为$。可以修改为:
    [root@localhost ~]# PS1="->";export PS1
    
->PS1="star trek:";export PS1
    star trek:
    9、PS2
    附属提示符,缺省为符号>。用于执行多行命令或超过一行的一个命令。如:
    [root@localhost ~]# echo "
    > a"
    a
    [root@localhost 
~]# echo $PS2
    
>
    [root@localhost 
~]# PS2="@:";export PS2
    [root@localhost 
~]# echo "
    @:a"
    a
    8、SHELL
    SHELL变量保存缺省shell,通常在/etc/passwd/中已设置。
    [root@localhost ~]# echo $SHELL
    
/bin/bash
    9、TERMINFO
    终端初始化变量保存终端配置文件的位置。
    10、TERM
    保存终端类型。
    11、TZ
    时区变量保存时区值,只有系统管理员才能够更改。
   
    将变量导出到子进程
    shell新用户碰到的问题之一是定义的变量如何导出到子进程。前面已经讨论过环境变量的工作方式,现在用脚本实现
它,并在脚本中调用另一脚本(这实际上创建了一个子进程)。
       以下是两个脚本列表 father和child。
       father脚本设置变量film,取值为 A Few Good Men ,并将变量信息返回屏幕,然后调用脚本child ,这段脚本
显示第一个脚本里的变量 film,然后改变其值为 Die Hard ,再将其显示在屏幕上,最后控制返回 father 脚本,再次
显示这个变量。
    father文件:
    [root@localhost D]# cat father
    echo 
"this is the father"
    FILM
="A Fer Good Men"
    echo 
"I like the film :$FILM"
    .
/child
    echo 
"back to father"
    echo 
"and the file is :$FILM"
    child文件:
    [root@localhost D]# cat child
    echo 
"called from father..i am the child"
    echo 
"file name is :$FILM"
    FILM
="Die Hard"
    echo 
"changing file to :$FILM"
    结果显示为(在这之前可能要修改文件权限):
    [root@localhost D]# ./father
    
this is the father
    I like the film :A Fer Good Men
    called from father..i am the child
    file name 
is :
    changing file to :Die Hard
    back to father
    and the file 
is :A Fer Good Men
    可以看到father中并未导出变量film,因此child脚本中不能将film变量返回。需要在father中加入export命令
,以便child脚本知道film变量的取值,才会工作。
    [root@localhost D]# cat father
    echo 
"this is the father"
    FILM
="A Fer Good Men"
    echo 
"I like the film :$FILM"
    export FILM
    .
/child
    echo 
"back to father"
    echo 
"and the file is :$FILM"
    再运行father脚本:
    [root@localhost D]# ./father
    
this is the father
    I like the film :A Fer Good Men
    called from father..i am the child
    file name 
is :A Fer Good Men
    changing file to :Die Hard
    back to father
    and the file 
is :A Fer Good Men
    
    4中变量,本地、环境,还有位置变量和特定变量参数因为他们是只读的。
    位置变量
    如果要向一个shell脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚本,此数目可以任意多,但只
有前 9个可以被访问,使用shift命令可以改变这个限制。
    参数从第一个开始,在第 9个结束;每个访问参数前要加 $ 符号。第一个参数为 0,表示预留保存实际脚本名字。无论
脚本是否有参数,此值均可用。
    加入向脚本传送Did You See The Full Moon信息,解释为:
    $0                     $1          $2          $3          $4         $5         $6        $7        $8        $9
    脚本名字      Did        You      See        The       Full       Moon    
    例如创建脚本param
    [root@localhost test]# cat param
    echo    
"This is the script name                : $0" 
    echo    
"This is the first parameter            : $1"
    echo    
"This is the second parameter           : $2"
    echo    
"This is the third parameter            : $3"
    echo    
"This is the fourth parameter           : $4"
    echo    
"This is the fifth parameter            : $5"
    echo    
"This is the sixth parameter            : $6"
    echo    
"This is the seventh parameter          : $7"
    echo    
"This is the eight parameter            : $8"
    echo    
"This is the ninth parameter            : $9"
    运行(可能需要权限):
    [root@localhost test]# ./param Did You See The Full Moon
    This 
is the script name                     : ./param
    This 
is the first parameter             : Did
    This 
is the second parameter            : You
    This 
is the third parameter             : See
    This 
is the fourth parameter            : The
    This 
is the fifth parameter             : Full
    This 
is the sixth parameter             : Moon
    This 
is the seventh parameter           : 
    This 
is the eight parameter             : 
    This 
is the ninth parameter             :     
    所以如果需要返回脚本名称可以为:
    [root@localhost test]# cat param2
    echo 
"Hello world this is $0 calling"
    [root@localhost test]# .
/param2
    Hello world 
this is ./param2 calling
    或者通过脚本向系统命令传递参数:
    [root@localhost test]# cat findfile
    find 
/ -name $1 -print
    [root@localhost test]# .
/findfile passwd
    
/usr/bin/passwd
    
/etc/pam.d/passwd
    
/etc/passwd
    
    特定变量参数
                    特定shell变量
    -----------------------------------------
    $#    传递到脚本的参数个数
    $*    以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
    $$    脚本运行的当前进程ID号
    $!    后台运行的最后一个进程的进程ID号
    $@    与$#相同,但是使用时加引号,并在引号中返回每个参数
    $-    显示shell使用的当前选项,与set命令功能相同。
    $?    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
    -----------------------------------------
    创建文件allparams:
    [root@localhost test]# cat allparams
    echo    
"This is the script name                   : $0" 
    echo    
"This is the first parameter              : $1"
    echo    
"This is the second parameter        : $2"
    echo    
"This is the third parameter             : $3"
    echo    
"This is the fourth parameter           : $4"
    echo    
"This is the fifth parameter              : $5"
    echo    
"This is the sixth parameter              : $6"
    echo    
"This is the seventh parameter        : $7"
    echo    
"This is the eight parameter             : $8"
    echo    
"This is the ninth parameter             : $9"
    echo    
"The number of arguments passed  : $#"
    echo    
"Show all arguments                          : $*"
    echo    
"Show me my process ID                  : $$"
    echo    
"Show me the arguments in quotes : $@"
    echo    
"Did my script go with any errors    : $?"
    运行:
    [root@localhost test]# ./allparams Merry Christmas Mr.Lawrence
    This 
is the script name                     : ./allparams
    This 
is the first parameter                : Merry
    This 
is the second parameter          :Christmas
    This 
is the third parameter               : Mr.Lawrence
    This 
is the fourth parameter             : 
    This 
is the fifth parameter                : 
    This 
is the sixth parameter               : 
    This 
is the seventh parameter         : 
    This 
is the eight parameter              :    
    This 
is the ninth parameter              : 
    The number of arguments passed  : 
3
    Show all arguments                           : Merry Christmas Mr.Lawrence
    Show me my process ID                   : 
20055
    Show me the arguments 
in quotes  : Merry Christmas Mr.Lawrence
    Did my script go with any errors     : 
0
    由上面的$?返回值可知,它可以用来判断脚本运行的成功与否,返回0表示成功,1表示错误:
    例如,拷贝一个文件并检查是否成功:
    [root@localhost test]# cp param pp
    [root@localhost test]# echo $
?
    
0
    但是拷贝一个不存在的文件,返回错误,如:
    [root@localhost test]# cp aaa bbb
    cp: 无法 stat “aaa”: 没有那个文件或目录
    [root@localhost test]# echo $?
    
1
 

posted on 2011-02-25 19:35 八路 阅读(627) 评论(0)  编辑 收藏 引用 所属分类: 嵌入式linux笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理