shell@变量

1. 什么是 Shell 变量

Shell 变量是用来存储数据的容器,可以在脚本或 Shell 会话中保存和操作值。它们通常是键值对的形式,比如 name=value,不需要提前声明类型(Shell 是弱类型语言)。

变量类型

  • shell变量 (仅仅在shell中有效)
  • 局部变量 (x=y 函数局部变量 local x=y,仅仅在函数内部有效)
  • 只读变量(变量不能被修改 readonly x=y)
  • 环境变量 (export x=y, 其他shell也可以使用变量x)

2. 定义变量

  • 语法变量名=值
  • 规则
    • 变量名区分大小写,通常用大写字母表示环境变量,小写或驼峰式用于局部变量。
    • 变量名不能以数字开头,不能包含空格或特殊字符(除了下划线 _)。(字母/下划线开头)
    • 等号两边不能有空格。
1
2
3
4
5
6
name="Alice"
age=25

x=y
x='y'
x="y"

3. 访问变量

  • $变量名${变量名} 获取变量的值。
  • ${变量名} 在变量名后紧跟其他字符时很有用,避免歧义。
1
2
3
echo $name        # 输出: Alice
echo ${name} # 输出: Alice
echo ${name}_test # 输出: Alice_test (变量 + 字符串 拼接)

4. 变量类型

Shell 中的变量没有严格的类型,但根据用途可以分为:

  1. 局部变量

    • 只在当前脚本或 Shell 会话中有效。
    • 示例:temp="hello"
  2. 环境变量

    • 通过 export 导出,可被子进程继承。

      1
      export PATH="/usr/local/bin:$PATH"
  3. 只读变量

    • readonlydeclare -r 定义,不能修改。

      1
      2
      readonly PI=3.14
      PI=3 # 报错
  4. 特殊变量

    • Shell 内置的变量,具有特定含义:
      • $0:脚本名称。
      • $1, $2, …:脚本的第 1、2 个参数。
      • $#:参数个数。
      • $@$*:所有参数。
      • $$:当前脚本的进程 ID。
      • $?:上一个命令的退出状态(0 表示成功)。
1
2
echo "脚本名: $0"
echo "第一个参数: $1"

5. 变量赋值与默认值

  • 默认值:如果变量未定义,可以用 ${变量名:-默认值}
  • 赋值默认值:用 ${变量名:=默认值},如果未定义则赋值。
  • 删除变量(x=y; unset x; echo $x)
1
2
3
4
5
echo ${var:-"default"}  # 如果 var 未定义,输出 "default",但 var 仍未赋值
echo ${var:="default"} # 如果 var 未定义,赋值并输出 "default"

# 命令结果赋值给变量
str1=`ls` == str1=$(ls)

6. 变量的作用域

  • 局部变量:默认只在当前 Shell 或脚本中有效。
  • 全局变量:用 export 导出后,子进程可以访问
  • 函数内局部变量:用 local 关键字限制作用域。
1
2
3
4
5
6
7
my_func() {
local var="inside function"
echo $var
}
var="outside"
my_func # 输出: inside function
echo $var # 输出: outside

7. 字符串操作

Shell 变量常用于处理字符串,支持一些基本操作:

  • 拼接:直接将变量和字符串放在一起。
    1
    2
    name="Alice"
    echo "$name Smith" # 输出: Alice Smith
  • 长度:用 `$