本地变量
本地变量在用户现在的 shell生命期的脚本中使用。如果在shell中启动另一个进程或退出,此值将无效。这个方法的优点就是用户不能对其他的 shell或进程设置此变量有效。
格式
$ variable-name(变量名)=value(所赋的值)
或 $ { variable -name =value }
注:使用变量时,如果用花括号将之括起来,可以防止 shell误解变量值。
- 变量设置时的不同模式:
例:
[root@localhost home]# great_number=30
[root@localhost home]# echo ${great_number}
30
[root@localhost home]# great_char="hello,world"
[root@localhost home]# echo ${great_char}
hello,world
- 清除变量
使用unset清除变量
格式:
unset variable-name
例:
root@localhost home]# unset great_char
[root@localhost home]# echo ${great_char}
[root@localhost home]# unset _number
[root@localhost home]# echo${great_number}
- 显示所有本地shell变量
使用set命令显示所有本地定义的shell变量。
[root@localhost home]# set
ABRT_DEBUG_LOG=/dev/null
BASH=/usr/bin/bash
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
set输出可能很长。查看输出时可以看出 shell已经设置了一些用户变量以使工作环境更加容易使用。
- 结合变量值
将变量并排可以使变量结合在一起:
echo ${variable_name}${variable_name}・・・
例:
[root@localhost home]# name='xierbi'
[root@localhost home]# familyname='tom
[root@localhost home]#${name}${familyname}
bash: xierbitom:
- 测试变量是否已经设置
(1)如果未设置或初始化,就可以使用另一值。此命
令格式为:
$ { variable: -value}
例:
[root@localhost home]# colour=blue
[root@localhost home]# echo "The sky is ${colour:-grey} today"
The sky is blue today
[root@localhost home]# unset colour
[root@localhost home]# echo "The sky is ${colour:-grey} today"
The sky is grey today
[root@localhost home]# echo ${colour}
[root@localhost home]#
如果设置了变量值,则使用它,如果未设置,则取新值.变量colour取值blue,echo打印变量colour时,首先查看其是否已赋值,如果查到,则使用该值.且并没有实际赋值,可以看到colour的值仍是空的。
(2)要完成检测是否赋值,没有赋值需要赋新值,需要使用下面格式:
${variable:=value}
(3)测试变量是否取值,然后返回带有系统错误信息的结果。
variabl:?value
[root@localhost home]# echo "The sky is ${colour:? "the variable have no value"}"
bash: colour: the variable have no value
coulour并没有赋值,出现提示字符
(4)
测试变量是否取值,如果未设置,则返回一空串。方法如下:
$ { variable: + value}
- 设置只读变量
如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人想要改变它,则返回错误信息。格式如下:
variable-name =value
readonly variable-name
环境变量
环境变量和本地便量显著的区别就在于本地变量只能用于所在的shell文件中,而环境变量应用于所有进程,包括编辑器脚本和应用。
传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用 export命令导出。环境变量与本地变量设置方式相同。
环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在 . profile文件中定义。
- 设置环境变量
VARIABLE-NAME=value;export VARIABLE-NAME
在两个命令之间是一个分号,也可以这样写:
VARIABLE-NAME = value
Export VARIABLE-NAME
- 显示环境变量、清除环境变量、显示所有环境变量和本地变量相同
[root@localhost home]# CONSOLE=shell; export CONSOLE
[root@localhost home]# echo ${CONSOLE}
shell
[root@localhost home]# unset CONSOLE
[root@localhost home]# echo ${CONSOLE}
[root@localhost home]# env
XDG_VTNR=1
XDG_SESSION_ID=1
SSH_AGENT_PID=2461
HOSTNAME=localhost.localdomain
,,,,,,,
- 嵌入shell变量
Brourne shell 有一些预留的环境变量名,这些变量名不能用作其他用途。通常在
/ etc/ profile中建立这些嵌入的环境变量。
(1)CDPATH
改变目录路径变量,保留一系列由冒号隔开的路径名,用于cd命令.如果设置了CDPATH,cd一个目录时,首先查找CDPATH,如果CDPATH指明此目录,则此目录成为当前工作目录.
$ CDPATH=:/home/dave/bin:/usr/local/apps;export CDPATH.
如果要
$ cd apps
cd命令首先在CDPATH中查找目录列表,如果发现 apps,则它成为当前工作目录。
(2)EXINIT
该变量保存使用vi编辑器时的初始化选项,例如,调用vi时,要显示行号,且在第十个空格加入tab键,命令:
$EXINIT='set nu tab=10';export EXINIT
(3)HOME
HOME目录通常定位与passwd文件的倒数第二列,用于保存用户自身文件,设置了HOME目录,可以简单使用cd命令进入它.
$cd $HOME
(4)IFSIFS
用作shell指定的缺省域分隔符.原理上讲域分隔符可以是任意字符,但缺省通常是空格,新行或tab键盘,IFS在分隔文件或变量中各域时很有用.下面的例子讲IFS设置为冒号,然后echo PATH变量,给出一各目录分隔开来的可读性很强的路径列表.
$echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/smallfish/bin$export
IFS=:
$echo $PATH
/usr/kerberos/bin /usr/local/bin /bin /usr/bin /usr/X11R6/bin /home/smallfish/bin
(5)MAIL
MAIL变量保存邮箱路径名,缺省为/var/spool/mail/<login name>.shell周期性检查新邮件,如果有新邮件,在命令行会出现一各提示信息.如果邮箱并不在以上指定位置,可以用MAIL设置.
$MAIL=/usr/mail/dave; export MAIL
(6) MAILCHECK
MAILCHECK缺省每6 0 s检查新邮件,但如果不想如此频繁检查新邮件,比如设为每 2 minutes,
使用命令:
$ MAILCHECK=120;export MAILCHECK
(7) MAILPATH
如果有多个邮箱要用到MAILPATH,此变量设置将覆盖MAIL设置。
$ MAILPATH=/var/spool/dave:/var/spool/admin;export MAILPATH
上面的例子中,MAIL检测邮箱dave和admin。
(8)PS1
基本提示符包括shell提示符,缺省对超级用户为#,其他为$.可以使用任何符号作为提示符.
$PS1="star trek:"; export PS1
star trek:
$PS1="->";export PS1
->
(9)PS2
PS2为附属提示符,缺省为符号>.PS2用于执行多行命令或超过一行的一各命令.
$PS2="@:"; export PS2
$for loop in *
@:do
@:echo $loop
退出PS2用Ctrl+C
(10)SHELL
SHELL变量保存缺省shell,通常在/etc/passwd中已设置,但如果有必要使用另一个shell,可以用如下方法覆盖当前shell:
$echo $SHELL/bin/bash
(11).TERMINFO
终端初始化变量保存终端配置文件的位置.通常在/usr/lib/terminfo或/usr/share/terminfo
$TERMINFO=/usr/lib/terminfo; export TERMINFO
(12).TERMTERM
变量保存终端类型.设置TERM使应用获知终端对屏幕和键盘响应的控制序列类型,常用的有vt100,vt200,vt220-8等.
$TERM=vt100;export TERM
(13).TZ
时区变量保存时区值,只有系统管理员才可以更改此设置,例:
$echo $TZ
GMT2EDT
返回值表明正在使用格林威治标准时间,与GMT时差威0,并作EDT保存.
- 还有一些预留的环境变量.其他系统或命令行应用将用到它们.以下是最常用的一些,注意这些值均未有缺省设置,必须显示说明.
1.EDITOR
设置编辑器,最常用.
$EDITOR=vi;export EDITOR
2.PWD
当前路径名,用cd命令设置此选项
3.PAGER
保存屏幕翻页命令,如pg,more,在查看man文本时用到此功能.
$PAGE='pg -f -p';export PAGER
4.MANPATH
保存系统上man文本的目录.目录间用马号分隔.
$MANPATH=/usr/apps/man:/usr/local; export MANPAGE5.LPDEST或PRINTER$LPDEST=hp3si-systems
将变量导出到子进程
定义的变量如何导出到子进程?
导出形式:
export 变量名
下面举个例子来说明:
b.sh
#father script.
echo "this is the father"
FILM="A Few Good Men"
echo "I like the film:$FILM"
./b2.sh #call the child (执行子进程文件)
echo "back to father"
echo "and the film is:$FILM"
b2.sh
#!/bin/sh
#child
echo "called from father..i am the child"
echo "film name is :$FILM"
FILM="Die Hard"
echo "changing film to :$FILM"
执行:
[root@localhost home]# sh b.sh
this is the father
I like the film:A Few Good Men
b.sh:行8: ./b2.sh: 权限不够
back to father
and the film is:A Few Good Men
如果出现权限不够字样是因为b2.sh文件权限为不可执行,我们添加文件权限即可:
chmod u+x b2.sh
结果:
[root@localhost home]# sh b.sh
this is the father
I like the film:A Few Good Men
called from father..i am the child
film name is :
changing film to :Die Hard
back to father
and the film is:A Few Good Men
可以看到子进程b2.sh并没有继承父进程的变量,所以为空。我们利用export导出进行改写:
#!bin/sh
#father script.
echo "this is the father"
FILM="A Few Good Men"
echo "I like the film:$FILM"
#call the child scri
export FILM #导出变量到b2.sh
./b2.sh
echo "back to father"
echo "and the film is:$FILM"
结果:
[root@localhost home]# sh b.sh
this is the father
I like the film:A Few Good Men
called from father..i am the child
film name is :A Few Good Men
changing film to :Die Hard
back to father
and the film is:A Few Good Men
最后,可以看到b2.sh接受到了FILM的值。
位置变量参数
可以向shell文件中$0~$9这9个位置直接传送信息
- 在脚本中使用位置参数
例:
#!/bin/sh
#b.sh
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 eighth parameter : $8"
echo "This is the ninth parameter : $9"
在shell文件后直接加所要传递的信息,给9个值的信息分别空格隔开
sh b.sh im Mr tom ,i am very cool
执行结果:
[root@localhost home]# sh b.sh im Mr tom ,i am very cool
This is the script name :b.sh
This is the first parameter : im
This is the second parameter : Mr
This is the third parameter : tom
This is the fourth parameter : ,i
This is the fifth parameter : am
This is the sixth parameter : very
This is the seventh parameter : cool
This is the eighth parameter :
This is the ninth parameter :
- 向系统命令传递参数
可以在脚本中向系统命令传递参数。
例:
#!/bin/sh
# findfile
find / -name $1 -print
运行结果:
[root@localhost home]# sh b.sh password
/etc/openldap/certs/password
[root@localhost home]#
- 特定变量参数
特定s h e l l变量
$ # 传递到脚本的参数个数
$ * 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9个
$ $ 脚本运行的当前进程I D号
$ ! 后台运行的最后一个进程的进程 I D号
$ @ 与$ #相同,但是使用时加引号,并在引号中返回每个参数
$ - 显示s h e l l使用的当前选项,与s e t命令功能相同
$ ? 显示最后命令的退出状态。 0表示没有错误,其他任何值表明有错误。
注意:$ ?返回0。可以在任何命令或脚本中返回此变量以获得返回信息。基于此信息,可
以在脚本中做更进一步的研究,返回 0意味着成功,1为出现错误。
下面的例子拷贝文件到/ t m p,并使用$ ?检查结果。
$ cp ok. txt /tmp
$ echo $?
0
现在尝试将一个文件拷入一个不存在的目录:
$ cp ok.txt /usr/local/apps/dsf
cp: cannot create regular file '/usr/local/apps/dsf': No such file or directory
$ echo $?
1