
当谈到shell编程时,变量和参数是两个非常重要的概念。在shell脚本中,你可以使用变量和参数来存储和操作数据,以及控制脚本的执行流程。本文将介绍shell变量和参数的各种用法和使用场景。
变量
在shell脚本中,变量是一个用于存储数据的名称。可以将变量看作是一个容器,用于存储各种类型的数据,例如字符串、数字和数组。你可以使用以下语法来定义和使用变量:
# 定义变量
var_name=value
# 使用变量
echo $var_name
在上面的代码中, var_name 是变量的名称, value 是变量的值。要使用变量,请在变量名称前加上 $ 符号。
变量类型
在shell中,变量的类型是动态的,这意味着变量的类型可以在运行时根据其值自动更改。你不需要在定义变量时指定其类型。
环境变量
在shell中,还有一类特殊的变量称为环境变量。环境变量是在shell启动时设置的变量,用于控制环境的行为。例如, PATH 是一个环境变量,用于指定可执行文件的搜索路径。你可以使用以下命令来查看当前设置的所有环境变量:
env
参数
在shell脚本中,你可以使用参数来传递数据到脚本中。参数是指在运行脚本时提供给脚本的值。在shell中,有两种类型的参数:位置参数和特殊参数。
位置参数
位置参数是指在脚本运行时提供给脚本的参数,这些参数按照它们提供的顺序进行编号。在shell中,你可以使用以下语法来访问位置参数:
$0 # 脚本名称
$1 # 第一个参数
$2 # 第二个参数
...
例如,如果你运行以下命令:
./myscript.sh arg1 arg2 arg3
那么在 myscript.sh 脚本中,你可以使用以下语法来访问这些位置参数:
echo $0 # 输出 "myscript.sh"
echo $1 # 输出 "arg1"
echo $2 # 输出 "arg2"
echo $3 # 输出 "arg3"
特殊参数
在shell中,还有一些特殊的参数,用于控制脚本的行为。以下是一些常用的特殊参数:
- $#: 传递给脚本的参数数量。
- $* 或 $@: 所有传递给脚本的参数,每个参数都用空格分隔。
- $?: 上一个命令的退出状态码。
- $: 当前进程的进程ID。
- $!: 后台进程的进程ID。
使用场景
变量和参数在shell编程中有许多用途。以下是一些常见的使用场景:
- 存储和操作数据:你可以使用变量来存储和操作各种类型的数据,例如字符串、数字和数组。
- 控制脚本流程:你可以使用变量和参数来控制脚本的执行流程,例如循环和条件语句。
- 传递数据:你可以使用参数来传递数据到脚本中,例如文件名和目录名。
- 环境变量:你可以使用环境变量来控制shell环境的行为,例如搜索路径和语言设置。
总之,变量和参数是shell编程中非常重要的概念。熟练掌握这些概念将有助于你更好地编写和管理shell脚本。
各种应用场景通过案例分析
#!/bin/bash
# 变量:赋值和替换
a=375
hello=$a
# ^ ^
#-------------------------------------------------------------------------
# 在初始化变量时,=符号两侧不允许有空格。
# 如果有空格会发生什么?
# "VARIABLE =value"
# ^
#% 脚本会尝试运行 "VARIABLE" 命令,带一个参数 "=value"。
# "VARIABLE= value"
# ^
#% 脚本会尝试运行 "value" 命令,
#+ 并将环境变量 "VARIABLE" 设置为空字符串。
#-------------------------------------------------------------------------
echo hello # hello
# 不是变量引用,而只是字符串 "hello" ...
echo $hello # 375
# ^ 这是一个变量引用。
echo ${hello} # 375
# 与上面一样,也是一个变量引用。
# 引用处理 . . .
echo "$hello" # 375
echo "${hello}" # 375
echo
hello="A B C D"
echo $hello # A B C D
echo "$hello" # A B C D
# 可以看出,echo $hello 和 echo "$hello" 的结果不同。
# =======================================
# 引用变量会保留空白。
# =======================================
echo
echo '$hello' # $hello
# ^ ^
# 由单引号转义变量引用,使美元符号 "#34; 被字面解释。
# 注意引用的不同方式。
hello= # 将其设置为 null 值。
echo "\$hello (null value) = $hello" # $hello (null value) =
# 注意,将变量设置为 null 值与取消设置不同,尽管最终结果相同(参见下文)。
# --------------------------------------------------------------
# 如果用空格分隔,可以在同一行上设置多个变量。
#+ 不过这可能会降低可读性,并且可能不可移植。
var1=21 var2=22 var3=$V3
echo
echo "var1=$var1 var2=$var2 var3=$var3"
# 可能会与 "sh" 的旧版本有问题 . . .
# --------------------------------------------------------------
echo; echo
numbers="one two three"
# ^ ^
other_numbers="1 2 3"
# ^ ^
# 如果变量中嵌入了空格,则需要使用引号。
# other_numbers=1 2 3 # 会给出错误信息。
echo "numbers = $numbers"
echo "other_numbers = $other_numbers" # other_numbers = 1 2 3
# 转义空格也可以。
mixed_bag=2\ ---\ Whatever
# ^ ^ 转义符 (\) 后有一个空格。
echo "$mixed_bag" # 2 --- Whatever
echo; echo
echo "uninitialized_variable = $uninitialized_variable"
# 未初始化的变量具有 null 值(根本没有值!)。
uninitialized_variable= # 声明,但不初始化它 --
#+ 与将其设置为 null 值相同,如上所述。
echo "uninitialized_variable = $uninitialized_variable"
# 它仍然具有 null 值。
uninitialized_variable=23 # 设置它。
unset uninitialized_variable # 取消设置。
echo "uninitialized_variable = $uninitialized_variable"
# uninitialized_variable =
# 它仍然具有 null 值。
echo
exit 0
总结与注意事项

通过上述实际脚本我们可以发现使用shell有很多注意事项,因此有必要单独拿出来总结下,当使用参数和变量时,需要注意以下几点:
- 变量名只能包含字母、数字和下划线,且必须以字母或下划线开头。
- 变量名区分大小写。
- 声明变量时,变量名和等号之间不能有空格。
- 如果变量值包含空格或特殊字符,需要使用引号(单引号或双引号)进行引用。
- 可以在同一行上设置多个变量,但是这可能会降低可读性,并且可能不可移植。
- 当访问变量时,需要在变量名前加上美元符号($)。
- 参数可以通过命令行传递给脚本,使用特殊变量($1、$2、$3...)来引用它们。
- 特殊变量($0、$@、$*、$#、$?、$)用于访问脚本本身、所有参数、所有参数作为单个字符串、参数数量、上一条命令的退出代码和当前进程的进程号等信息。
- 使用未初始化的变量会导致错误,应该在使用变量之前对其进行初始化。
- 尝试使用未声明的变量会导致错误,应该在使用变量之前声明它。
- 可以使用 unset 命令取消变量的设置。
- 在初始化变量时,=符号两侧不允许有空格。如果有空格,脚本会尝试运行命令,而不是将其作为变量名和值的分隔符。
常见错误包括:
- 拼写错误或语法错误。
- 忘记使用引号来引用包含空格或特殊字符的变量值。
- 使用未声明或未初始化的变量。
- 试图在变量名和等号之间添加空格。
- 忘记在变量名前加上美元符号($)。
- 错误地使用特殊变量或错误地引用参数。