环境变量是操作系统环境设置的变量,适用于整个系统的用户进程;
环境变量可以在命令中设置,但是用户注销的时候将会丢失这些设置值;
若要重复适用,则最好在.profile中定义;环境变量的使用与本地变量的使用方法相同,但是在使用之前,必须用export命令导出。
1.设置环境变量
同一行键入2个语句,使用分号隔开
VARIABLE-NAME=value; export VARIABLE-NAME
也可以分行写:
VARIABLE-NAME=value
export VARIABLE-NAME
2.查看环境变量:env
3.清除环境变量:unset VARIABLE-NAME
4.嵌入shell变量
4.1 CDPATH:此变量保留了一些目录信息,用冒号“:”隔开。
如果设置了此变量,在cd一个目录的时候,shell会先去查找此变量保存的值;
如果此变量中保存了cd切换的目录,则切换到该目录下。
4.2 EXINIT:此变量保存使用vi编辑器的初始化选项,如显示行号,并在第10个空格加入tab键,
命令为:EXINIT=’set nu tab=10′;export EXINIT
4.3 HOME:HOME目录,通常用于定位passwd文件的倒数第2列,指定用户登录后进入自己的目录,
在这个目录下保存用户自己的文件信息。当输入:cd $HOME时,就切换到用户的跟目录下。
4.4 IFS:用于shell指定的缺省域分隔符;缺省域分隔符可以为:空格、新行、tab键。
4.5 LOGNAME:保存登录名
4.6 MAIL:保存邮箱路径名,默认为/var/spool/mail/<login-name>。
4.7 MAILCHECK:默认为没60s检查新邮件,可以设置为其他时间,如180s。
4.8 MAILPATH:存储多个用户的邮箱路径,设置此变量将覆盖MAIL的值。
4.9 PATH:保存进行命令或脚本查找的目录顺序,对这些目录的排序很重要,
因为这关系到执行命令查询时间问题;通常我们都是先从用户根目录下去查询,在到其他目录下。
4.10 PS1:基本提示符,超级用户为#,普通用户可以任意设置。
4.11 PS2:附属提示符,默认“>”,用于执行多行命令或超过一行的一个命令。
4.12 SHELL:保存默认shell,通常在/etc/passwd中设置,可以进行修改,使用其他shell。
4.13 TERMINFO:终端初始化变量保存终端配置文件的位置。
4.14 TERM:保存终端类型,设置TERM是应用获知终端对屏幕和键盘响应的控制序列类型,
如vt100、vt200等
4.15 TZ:保存时区值,只有系统管理员才可以更改此设置。
5.其他环境变量
还有其他一些预留的环境变量,其他系统或命令行应用将用到他们,如:
5.1 EDITOR:设置编辑器,这个比较常用。
5.2 PWD:保存当前工作路径名。
5.3 PAGER:保存屏幕翻页命令,如pg、more
5.4 MANPATH:保存系统上man文件的目录,各个目录之间用“:”隔开。
5.5 LPDEST或PRINTER:保存默认打印机名,用于打印作业是指定打印机名。
6.set命令
在$HOME.profile文件中,设置环境变量时,除了export可以导出之外,还有set -a命令,
可以指明所有变量直接被导出;不过别在/etc/profile中设置,在自己的$HOME.profile中设置。
下面是一个shell脚本的实例
在father.sh脚本中,调用child.sh脚本,并修改father.sh中的变量值,如下:
pg father.sh
# father script
echo “This is the father”
SMART_PHONE=”iPhone 5″
echo “I have the phone:$SMART_PHONE”
# call the child script
sh child.sh
echo “The phone father owned is:$SMART_PHONE”
pg child.sh
# child
echo “called from father..i am the child”
echo “phone is:${SMART_PHONE:-unknow}”
SMART_PHONE=”Meizu MX2″
echo “changing SMART_PHONE to:$SMART_PHONE”
执行脚本:
sh father.sh
This is the father
I have the phone:iPhone 5
called from father..i am the child
phone is:unknow ->①不认识父进程中的变量
changing SMART_PHONE to:Meizu MX2
The phone father owned is:iPhone 5
可以看到,在子进程中并不认识父进程中的变量,这是因为我们没在父进程中导出变量值。
修改father.sh脚本:
pg father.sh
# father script
echo “This is the father”
SMART_PHONE=”iPhone 5″
echo “I have the phone:$SMART_PHONE”
# call the child script
export SMART_PHONE ->②
sh child.sh
echo “The phone father owned is:$SMART_PHONE”
现在执行修改后的脚本,子进程认识父进程传递过来的变量了:
sh father.sh
This is the father
I have the phone:iPhone 5
called from father..i am the child
phone is:iPhone 5 ->①导出之后,认识了
changing SMART_PHONE to:Meizu MX2
The phone father owned is:iPhone 5
本地变量在用户当前的shell生命周期之内有效,结束当前进程,启动另一个进行,则此变量将无效。设置本地变量的格式:
variable-name = value 或者 {valiable-name=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,则取value值,并将其赋给变量
variable-name:-value 如果未设置variable-name,则取value值,但不给变量赋值
—————————————————————————-
1.设置变量并显示其值
TODAY=”Thuesday”
echo ${TODAY}
Thuesday
MYINFO=”my name is $LOGNAME,my home is $HOME”
echo ${MYINFO}
my name is xxxx,my home is /usr/xxxx
2.重置变量:unset variable-name
echo ${MYINFO}
my name is xxxx,my home is /usr/xxxx
unset MYINFO
echo ${MYINFO}
3.显示本地所有shell变量:set
4.连接变量:echo ${variable-name}${variable-name}
echo ${LOGNAME}${HOME}
xxxx/usr/xxxx
5.检查变量是否被设置
命令格式:${variable:-value}
意思:如果设置了variable变量的值,则取之,否则使用value,但是不做赋值:variable=value。
设置变量值:
TODYA=”Thuesday”
显示变量:
echo “today is ${TODAY}”
today is Thuesday
重置变量:
unset TODAY
检查变量是否有值:
echo “today is ${TODAY:-unknow}”
today is unknow
查看TODAY的变量值:echo “today is ${TODAY}”
today is
这里显示TODAY变量现在已经没有包含任何值了。
6.下面这个命令,如果变量设置了值,则取之,否则取新值,并给变量赋新值:
${variable:=value}
设置变量值:
SMART_PHONE=”iPhone5″
查看变量值:
echo “a smart phone is ${SMART_PHONE}”
a smart phone is iPhone5
重置变量值:
unset SMART_PHONE
检查变量是否有值,若没值,则给其赋值,并显示新值:
echo “a smart phone is ${SMART_PHONE:=Meizu MX2}”
a smart phone is Meizu MX2
查看变量的新值:
echo ${SMART_PHONE}
Meizu MX2
7.如果要检查变量是否设置了值,如果有值,则显示值,否则显示一个系统错误信息:
echo “${MEIZU_MX2:?} is a better than MI2”
[or echo “${MEIZU_MX2?} is a better than MI2”]
ksh: MEIZU_MX2: 0403-040 Parameter null or not set.
8.如果变量有值,我们可以重新给其赋值:
SMART_PHONE=”iPhone 4s”
echo ${SMART_PHONE}
iPhone 4s
将变量的值修改了:
echo “a smart phone is ${SMART_PHONE+MX2}”
a smart phone is MX2
9.设置只读变量
格式:
variable-name=value
readonly variable-name
设置变量值:ENAME=”Scott”
查看变量值:
echo “employee 001122 is ${ENAME}”
employee 001122 is Scott
设置变量只读:readonly ENAME
修改变量值:
ENAME=”Amy”
ksh: ENAME: This variable is read only.
这里报错,变量ENAME为只读。
查看已经设置的只读变量值:
readonly
ENAME=Scott
*当前环境下,只读变量只有刚刚设置的这个ENAME。