首页 > 编程笔记 > Linux笔记 阅读:22

Shell变量的定义和使用(非常详细)

在 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} 的形式访问变量值的子字符串时,需要使用花括号。其中:
例如:
# 定义字符串变量
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

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

相关文章