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文件。