Linux平台及应用
潘小玲 郑国华 丁敏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Shell变量和Shell环境

发布时间:2020-03-11 16:40   发布人:潘小玲   浏览次数:657


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

$

3Shell变量的作用域

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。

4Shell环境变量

环境变量定义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命令。

注意:

用户还可以使用不带任何参数的envprintenvexport命令,显示当前定义的所有环境变量。

要取消一个环境变量的声明或赋值,也可以使用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时生效。