Shell变量的定义和使用(非常详细)
在 Shell 中,可以使用赋值语句来定义变量。赋值语句的格式如下:
下面是在 Shell 中定义变量的几个示例:
在 Shell 中,要访问变量的值,可以使用 $varname 的形式,即在变量名前面加上符号“$”。例如:
如果变量名中包含其他字符和特殊字符,或者变量名和其他文本混合在一起,则需要使用花括号“{}”来指定变量名。例如:
此外,在使用变量的特殊语法时,也需要使用花括号。例如,在使用 ${var:pos} 和 ${var:pos:len} 的形式访问变量值的子字符串时,需要使用花括号。其中:
例如:
这些特殊的语法可以方便地对变量的值进行操作和提取,使用这些语法截取变量值的一部分,或者获取变量值的长度等操作,可以提高脚本的灵活性和可读性。
数组变量是一种变量类型,可以存储多个值。在大多数 Shell 中,数组是用一个变量名加圆括号的形式来表示的。例如:
要访问数组的元素,可以使用 ${var[index]} 的形式。其中,var 表示数组的名称;index 表示要访问的元素的索引,索引从 0 开始。例如:
注意:在使用变量时,如果变量名被包含在双引号中,则变量名会被替换为变量的值;如果变量名被包含在单引号中,则变量名不会被替换。
常见的系统预设位置参数变量如下表所示。
位置参数变量主要用于获取脚本的输入参数,并根据这些参数执行相应的操作。
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这两种符号的区别在于,*符号会将所有元素看作一个单独的字符串,而@符号会将每个元素看作单独的字符串。
注意:在使用变量时,如果变量名被包含在双引号中,则变量名会被替换为变量的值;如果变量名被包含在单引号中,则变量名不会被替换。
预设位置参数变量
在 Shell 中,有许多系统预设变量,可以方便地用于访问系统信息和执行状态。其中,位置参数变量主要用来向脚本中传递参数或数据,其变量名不能自定义,变量作用也是固定的。常见的系统预设位置参数变量如下表所示。
序号 | 位置参数变量 | 描述 |
---|---|---|
1 | $0 | 脚本文件名 |
2 | $1-$9 | 脚本前 9 个位置参数 |
3 | $# | 传递给脚本的参数数量 |
4 | $@ | 脚本的命令行参数的数组 |
5 | $* | 脚本的命令行参数的字符串 |
6 | $? | 上一个命令的退出状态 |
7 | $$ | 当前 Shell 进程的进程 ID(Process Identifier,PID) |
8 | $! | 后台运行的最后一个进程的 ID |
位置参数变量主要用于获取脚本的输入参数,并根据这些参数执行相应的操作。