Shell变量和Shell环境
(1)Shell变量的分类
Shell变量大致可以分为以下3类。
Ø 内部变量:由系统提供,用户只能使用不能修改。
Ø 环境变量:这些变量决定了用户工作的环境,不需要用户定义,可以直接在Shell中使用,其中某些变量用户可以修改。
Ø 用户变量:由用户建立和修改,也称用户自定义变量。在Shell脚本编写中会经常用到。
(2)Shell 变量的定义和输出
Shell支持具有字符串值的变量。Shell 变量不需要专门的定义和初始化语句。一个没有初始化的Shell 变量被认为是空字符串。通常通过赋值语句完成变量说明并予以赋值,并且可以
给一个变量多次赋值以改变其值。
在Shell中,变量的赋值使用如下语法格式。
name=string
其中:
name是变量名,变量名是以字母或下画线开头的字母、数字和下画线字符序列。用户自定义变量按照惯例使用小写字母命名。
“=”是赋值符号。两边不能直接跟空格,否则Shell将视为命令。
string 是被赋予的变量值。 若string 中包含空格、 制表符和换行符,则string 必须用
sting或"tring"的形式,即用单(双)引号将其括起来。双引号内允许变量替换,而单引号则不可以。
通过在变量名(name)前加$字符,即用Sname 的形式引用变量的值,引用的结果就是用字符串string 代替Sname。此过程也称为变量替换。在字符串连接过程中为了界定变量名、避免混淆,变量替换也可以使用$ {name}的形式。
变量输出可使用Shell的内置命令echo (常用)或printf (用于格式化输出,类似C语言的printf()。
下面给出一个定义和使用Shell变量的例子。
操作步骤2.1定义和使用Shell变量举例
//显示字符串常量
$ echo I love you
I love you
$ echo ' I love you'
I love you
$ echo "I love you"
I love you
$
//由于要输出的字符串中没有特殊字符(Shell的保留字),所以""和"的效果一致
//不用""相当于使用""
$ echo Je t'aime
//由于要输出的字符串中有特殊字符(')
//由于'不匹配,Shell 认为命令行没有结束,回车后出现系统第二提示符
//让用户继续输入命令行。按<Curl C>键结束
//为了解决这个问题,可以使用下面的两种方法
$ echo "Je t'aime"
Je t'aime
//或
$ echo Je t'aime
Je t'aime
//定义变量
$v1=CentOS
$ echo $vl
CentOS
//中间有空格,用'括起来
$ v2='CentOS 7'
$ echo $v2
CentOS 7
//要置换HOSTTYPE环境变量的值使用" "括起来
$ v3="CentOS 7 SHOSTTYPE"
$ echo $v3
//SHOSTTYPE在双引号内,置换了其值
CentOS 7 x86_64
//同样地,单、双引号规则在字符串连接时也适用
$ echo I love $v1.
I love CentOS.
$ echo "I love $v1."
I love CentOS.
$ echo ' I love $v1.'
//单引号中的内容被原样输出
I love $v1.
$ echo "I love $v1."
//在双引号中使用转义字符,转义字符将其后的字符还原为字面本身
I love $v1.
$ echo "I love $$v1."
I love SCentOS.
//可以使用unset命令取消Shell变量的声明
$ unset vI
$ echo $vl
$
(3)Shell变量的作用域
Shell变量有其规定的作用范围。Shell 变量分为局部变量和全局变量。所有自定义变量默认都是局部变量;环境变量是全局变量。
Ø 局部变量的作用范围仅限制在其命令行所在的Shell或当前Shell脚本执行过程中。
Ø 全局变量的作用范围则包括定义该变量的Shell及其所有子Shell。
可以使用export内置命令将局部变量设置为全局变量。export的常用格式为:
#将指定的一个或多个局部变量设置为全局变量
export <变量名1>[<变量名2>… ]
#将指定的一个或多个全局变量设置为局部变量
export -n<变量名1>[<变量名2> …]
#直接对一个或多个全局变量赋值
export <变量名1=值1> [< 变量名2=值2> ..]
下面给出一个Shell变量作用域的例子。
操作步骤2.2 Shell变量作用域举例
//1-为varl赋值
$ varl=UNIX
//1-为var2赋值
$ var2=Linux
// 1-将变量var2的作用范围设置为全局
$ export var2
//1-直接为全局变量var3、 var4 赋值
$ export var3=centos var4=ubuntu
//1-在当前Shell中显示4个变量的值
$ echo $varl $var2 $var3 $var4
UNIX Linux centos ubuntu
/ /1-进入子Shell
$ bash
//2-显示varl的值
//2-由于varl在上一级Shell中没有被声明为全局,所以在子Shell里没有值
$ echo $varl
//2-显示var2、var3、var4的值
//2-由于这3个变量在上:一级Shell中被声明为全局变量,所以在子Shell里仍有值
$ echo $var2 $var3 $var4
Linux centos ubuntu
//2-在当前Shell 中将var2 设置为局部变量
$ export -n var2
//2-在当前Shell中var2仍有值
$ echo $var2
Linux
//2-进入孙子Shell
$ bash
//3-由于var2 在当前Shell的父Shell中已经设置为局部变量,所以在孙子Shell里没有值
//3-当然,varl 在当前Shell的祖父Shell中就是局部变量,所以在当前Shell里没有值
$ echo $varl $var2
//3-由于var3和var4在当前Shell的祖父Shell中设置为全局变量
//3-在当前Shell的父Shell中又没有变更,所以在当前Shell里仍有值
$ echo $var3 $var4
centos ubuntu
//3-返回父Shell
$ exit
// 2-显示当前Shell中变量的值
$ echo $var2 $var3 Svar4
Linux centos ubuntu
//2-修改变量var3的值
$ echo $var3
Centos7.1
//2-返回父Shell
$ exit
//1-已在父Shell中
$ echo $varl $var2 $var3 $var4
UNIX Linux centos ubuntu
$
注意:
(1)在当前Shell中要想使用父辈Shell 中的变量,至少要在当前Shell的父Shell中设置为全局变量。
(2)变量在子Shell中值的修改不会传回父Shell。
(4)Shell环境变量
环境变量定义Shell的运行环境,保证Shell命令的正确执行。Shell 用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。所有环境变量都是全局变量(即可以传递给子Shell),并可以由用户重新设置。下表中列出了一些系统中常用的环境变量。
Shell中的环境变量 | |||
环境变量名 | 说 明 | 环境变量名 | 说明 |
BASH | bash的完整路径名 | PATH | bash寻找可执行文件的搜索路径 |
EDITOR | 应用程序中默认使用的编辑器 | ENV | Linux查找配置文件的路径 |
HISTFILE | 用于储存历史命令的文件 | PSI | 命令行的一级提示符 |
HISTSIZE | 历史命令列表的大小 | PS2 | 命令行的二级提示符 |
HOME | 当前用户的用户目录 | PWD | 当前工作目录 |
OLDPWD | 前一个工作目录 | OLDPWD | 前一个工作目录 |
USER | 当前用户名 | IFS | 用于分割命令行参数的分隔符 |
UID | 当前用户的UID | SECONDS | 当前Shell开始后所流逝的秒数 |
TERM | 当前用户的终端类型 | LANG | 当前用户的主语言环境 |
这些变量都是可写的,用户可以为它们赋任何值。如果使用自己的环境变量,则应该使用前面介绍的export命令。
注意:
用户还可以使用不带任何参数的env、printenv或export命令,显示当前定义的所有环境变量。
要取消一个环境变量的声明或赋值,也可以使用unset命令。
(5)设置用户工作环境
用户登录系统时,Shell 为用户自动定义唯一的工作环境,并对该环境进行维护直至用户注销。该环境将定义如身份、工作场所和正在运行的进程等特性。这些特性由指定的环境变量值定义。
Shell环境与办公环境相似,在办公室中每个人所处环境的物理特性,如灯光和温度,但在办公环境中又有许多因素是个人特有的,如日常工作和个人工作空间,因此用户自己的工作环境就有别于其他用户的工作环境。正如一个用户的Shell环境不同于其他用户的Shell环境。
用户工作环境还有登录环境和非登录环境之分。登录环境是指用户登录系统时的工作环境,此时的Shell对登录用户而言是主Shell.非登录环境是指用户在调用子Shell时所使用的用户环境。
用户并不需要每次登录后都对各种环境变量进行手工设置,通过环境设置文件,用户的工作环境的设置可以在登录的时候自动由系统来完成。环境设置文件有两种,一种是系统环境设置文件,另一种是个人环境设置文件。
(1)系统中的用户工作环境设置文件(对所有用户均生效)
Ø 登录环境设置文件: /etc/profile。
Ø 非登录环境设置文件: /etc/bashrc。
(2)用户设置的环境设置文件(只对用户自身生效)
Ø 登录环境设置文件: $HOME/.bash profile。
Ø 非登录环境设置文件: $HOME/.bashrc。
注意:
1.工作环境设置文件是Shell脚本文件。
2.用户可以修改自己的用户环境设置文件,来覆盖在系统环境设置文件中
的全局设置。例如
(1)用户可以将自定义的环境变量存放在$HOME/.bash_profile 中。
(2)用户可以将自定义的别名存放在$HOME/.bashrc中,以便在每次登录和
调用子Shell时生效。