Linux自动化运维:Shell与Ansible(微课版)
上QQ阅读APP看书,第一时间看更新

1.2.5 Shell变量

在编程语言中,变量是一种存储数据的容器。它可以用来保存各种类型的数据,如数字、字符串、布尔值等。在Shell中,变量也是一种存储数据的容器,它有着与其他编程语言中的变量类似的基本概念,主要包括以下内容。

(1)变量名。变量名是变量的唯一标识,通常是一个字母或下画线开头的字符序列,如name、age、_score等。在Shell中,变量名只能由字母、数字和下画线组成,且不能以数字开头。变量名区分字母大小写,如NAME和name是不同的变量,环境变量建议使用全大写字母命名。

(2)变量类型。在Shell中,变量可以存储任何类型的数据,如整数、浮点数、字符串、布尔值等。变量的类型是由它所存储的数据决定的。

(3)变量值。变量值是指变量当前存储的数据。在Shell中,变量值可以通过赋值语句来修改。例如,在Bash中,可以使用a=10语句将变量a的值设为10。

V1-5 Shell变量

(4)变量作用域。变量作用域是指变量的有效范围。在Shell中,变量可以被定义为全局变量或局部变量。全局变量是指在整个Shell会话中都有效的变量。它们可以在任何地方被访问和修改,用户可以使用export命令将变量定义为全局变量。局部变量是指仅在特定的代码块或函数中有效的变量,它们只能在定义它们的代码块或函数中被访问和修改。

(5)定义和调用变量。在定义变量时,变量名和变量值之间需要使用等号“=”连接,变量名与等号之间不能有空格。在调用变量时,变量名需要使用$符号引用。

Shell中主要的变量类型如表1-6所示。

表1-6 Shell中主要的变量类型

1. 定义和调用变量

在Shell中,可以使用赋值语句来定义变量。

赋值语句的格式如下。


varname=varvalue

其中,varname表示变量名;varvalue表示变量值。

下面是在Shell中定义变量的几个示例。


# 定义字符串变量 
name="John Smith" 
# 定义数值变量 
age=30 
# 定义数组变量 
fruits=("apple" "banana" "orange") 
# 定义浮点数变量 
HEIGHT=1.75 
# 定义布尔值变量 
IS_ADMIN=true

一些特殊的变量,如$0、$1等,是由Shell自动赋值的,用于存储特定的信息。例如,$0变量存储的是脚本的文件名,$1变量存储的是脚本的第一个参数。

在Shell中,要访问变量的值,可以使用$varname的形式,即在变量名前面加上符号“$”。例如:


# 定义字符串变量
NAME="John Smith"
# 访问变量的值
echo "Name is $NAME"
# 输出:Name is John Smith

如果变量名中包含其他字符和特殊字符,或者变量名和其他文本混合在一起,则需要使用花括号“{}”来指定变量名。例如:


# 定义字符串变量
NAME="John"
# 访问变量的值
echo "Name is ${NAME}_Smith"
# 输出:Name is John_Smith

如果不使用花括号,则等号右边的字符会被当作变量的一部分,从而导致错误。例如:


# 定义字符串变量
name="John"
# 使用变量
echo "Hello, $name_Doe!"
# 输出:
Hello, !

在这种情况下,变量名后面的_Doe被当作变量的一部分,因此会返回空字符串。因此,在使用变量时,如果变量名后面跟有其他字符或者变量名组成的字符串,则通常需要使用花括号来指明变量名的边界。

此外,在使用变量的特殊语法时,也需要使用花括号。例如,在使用${var:pos}和${var:pos:len}的形式访问变量值的子字符串时,需要使用花括号。其中,var是变量的名称;pos是起始位置的偏移量,表示从变量值的第pos个字符开始,返回变量值的子字符串;len是子字符串的长度,表示从变量值的第pos个字符开始,返回长度为len的子字符串。例如:


# 定义字符串变量
string="abcdef"
# 使用变量
echo "${string:1}"
echo "${string:2:3}"
# 输出:
bcdef
cde
# 定义字符串变量
name="John"
# 调用变量,从字符串变量name的第二个字符(从0开始计数)开始,截取到字符串的末尾
echo "${name:1}"
输出:
ohn

# 定义字符串变量
name="John"
# 调用变量,从字符串变量name的第二个字符(从0开始计数)开始截取,截取长度为2
echo "${name:1:2}"
# 输出:
oh

注意,如果pos或len超出了变量值的长度范围,则将返回空字符串。

这些特殊的语法可以方便地对变量的值进行操作和提取,使用这些语法截取变量值的一部分,或者获取变量值的长度等操作,可以提高脚本的灵活性和可读性。

数组变量是一种变量类型,可以存储多个值。在大多数Shell中,数组是用一个变量名加圆括号的形式来表示的。例如:


array=(1 2 3 4 5)

这样,数组array就被定义为包含5个元素的数组,每个元素可以是一个字符串或数字。

要访问数组的元素,可以使用${var[index]}的形式。其中,var表示数组的名称;index表示要访问的元素的索引,索引从0开始。例如:


# 定义数组变量
fruits=("apple" "banana" "orange")
# 使用变量
echo "I like ${fruits[0]} and ${fruits[1]}"
# 输出:
I like apple and banana

要获取数组的所有元素,可以使用*或@符号:


echo ${array[*]}
1 2 3 4 5
echo ${array[@]}
1 2 3 4 5

这两种符号的区别在于,*符号会将所有元素看作一个单独的字符串,而@符号会将每个元素看作单独的字符串。

注意:在使用变量时,如果变量名被包含在双引号中,则变量名会被替换为变量的值;如果变量名被包含在单引号中,则变量名不会被替换。

2. 预设位置参数变量

在Shell中,有许多系统预设变量,可以方便地用于访问系统信息和执行状态。其中,位置参数变量主要用来向脚本中传递参数或数据,其变量名不能自定义,变量作用也是固定的。常见的系统预设位置参数变量如表1-7所示。

表1-7 常见的系统预设位置参数变量

位置参数变量主要用于获取脚本的输入参数,并根据这些参数执行相应的操作。

3. 查看环境变量

在Linux操作系统中,环境变量是一种特殊的变量,它们用于存储系统的配置信息。环境变量是系统级别的变量,它们可以在整个系统中使用,在用户的会话中也可以使用。环境变量通常用于存储系统路径、可执行文件的名称、用户名等信息。系统预设环境变量的命名规则通常是采用全大写字母。常见的系统预设环境变量如表1-8所示。

表1-8 常见的系统预设环境变量

在Linux操作系统中,可以使用以下方法查看环境变量。

(1)使用printenv命令查看系统中所有的环境变量。例如:


[opencloud@server ~]$ printenv

(2)使用echo命令查看某个特定的环境变量的值。例如:


# 查看HOME环境变量的值
[opencloud@server ~]$ echo "$HOME"
/home/opencloud
# 查看LANG环境变量的值
[opencloud@server ~]$ echo "$LANG"
en_US.UTF-8

(3)使用env命令查看当前进程的环境变量。例如:


[opencloud@server ~]$ env

(4)使用set命令查看当前Shell的所有变量,包括环境变量和Shell变量。例如:


[opencloud@server ~]$ set

(5)使用cat /proc/PID/environ命令查看某个进程的环境变量。例如:


# 查看进程9750的环境变量
[opencloud@server ~]$ cat /proc/9750/environ

4. 设置环境变量

在Shell中,export命令用于将变量设置为环境变量,设置的环境变量可以在整个系统中使用,在用户的会话中也可以使用。

export命令的基本语法如下。


export [变量名]=[变量值]

使用export命令设置环境变量及其验证方法如下。

(1)使用等号赋值。例如:


[opencloud@server ~]$ export NAME="John"
[opencloud@server ~]$ export USERNAME="Tom"
[opencloud@server ~]$ export MYHOME="/home/john"

注意:在Shell中,环境变量通常使用大写字母。

(2)使用echo命令查看环境变量的值。例如:


[opencloud@server ~]$ echo $NAME
John
[opencloud@server ~]$ echo $USERNAME
Tom
[opencloud@server ~]$ echo $MYHOME
/home/john

(3)使用环境变量的当前值。例如:


[opencloud@server ~]$ echo $PATH
/home/ opencloud/.local/bin:/home/ opencloud /bin:/usr/bin:/bin:/usr/sbin:/sbin:
/usr/local/openssh/bin:/usr/local/sbin
[opencloud@server ~]$ export PATH=$PATH:/usr/local/bin
[opencloud@server ~]$ echo $PATH # 查看PATH环境变量的输出结果
/home/ opencloud/.local/bin:/home/ opencloud /bin:/usr/bin:/bin:/usr/sbin:/sbin:
/usr/local/openssh/bin:/usr/local/sbin:/usr/local/bin
# export命令用于将 /usr/local/bin目录添加到系统路径中

export命令设置的环境变量只对当前Shell有效,在关闭Shell后将失效。如果想永久设置环境变量,则建议在配置文件中进行设置,如在/etc/profile或~/.bash_profile~/.bashrc等配置文件中进行设置。

使用export命令在~/.bashrc文件中设置MYVAR环境变量:


[opencloud@server ~]$ echo "export MYVAR=123" >> ~/.bashrc

~表示当前用户的家目录,export命令会将export MYVAR=123添加到~/.bashrc文件的末尾,从而设置MYVAR环境变量。

在修改环境变量所在配置文件之后,需要重新登录系统或在命令行中使用source命令来使配置生效。source命令的主要作用是加载并执行配置文件。使用source命令加载配置文件的好处是,可以在当前Shell中使修改立即生效,而不需要重新打开一个新的Shell。

使用source命令,使~/.bashrc文件中设置的MYVAR环境变量生效:


[opencloud@server ~]$ source ~/.bashrc

查看MYVAR环境变量的值:


[opencloud@server ~]$ echo "$MYVAR"
# 输出:123

此外,也可以使用source命令加载系统级别的配置文件。这样,在/etc/bashrc文件中定义的环境变量、别名等就可以在当前的Shell中使用了。


[opencloud@server ~]$ source /etc/bashrc

在Linux操作系统中,环境变量可以存储在多个文件中。将环境变量分别存储在这些文件中,可以灵活地管理系统级别和用户级别的配置,确保在不同的登录会话中和系统启动时正确加载环境变量。以下是常见的存储环境变量的文件及其用途。

(1)系统级别文件

① /etc/environment:存储适用于所有用户的系统级别环境变量。

② /etc/profile:在系统启动时加载,适用于所有用户,可以存储全局的环境变量。

③ /etc/bashrc:系统级别的Bash配置文件,用于设置Bash的默认行为。

(2)用户级别文件

① ~/.bashrc:在用户登录系统时加载,用于存储用户特定的环境变量。

② ~/.bash_profile:在用户登录系统时加载,可用于存储用户特定的环境变量。

③ ~/.bash_login:类似于 ~/.bash_profile,在用户登录时加载,用于设置环境变量。

④ ~/.bash_logout:在用户退出系统时加载,可用于清理或保存会话信息。

如果想修改系统级别的环境变量,则建议修改/etc/profile文件。如果想修改Bash的默认行为,则建议修改/etc/bashrc文件。