1. 命令简介
declare 是 Bash 内建命令,用于声明、设置或显示变量的值和属性。它可以创建具有特定属性(如只读、整型、数组等)的变量,也可以显示现有变量的属性和值。该命令在脚本编程中常用于精确控制变量的行为。
2. 语法格式
bash
运行
declare [-aAfFgilnrtux] [-p] [name[=value] ...]3. 常用选项及说明
3.1 显示控制选项
表格
| 选项 | 说明 |
|---|---|
| -f | 将操作限制为函数名及函数定义 |
| -F | 仅显示函数名(调试时可附加行号和源文件) |
| -g | 在 Shell 函数中使用时创建全局变量;其他情况下忽略 |
| -p | 显示指定变量的属性和值(未指定变量名时显示所有变量) |
3.2 属性设置选项
表格
| 选项 | 说明 |
|---|---|
| -a | 将变量声明为索引数组 |
| -A | 将变量声明为关联数组(Bash 4.0+) |
| -i | 将变量声明为整型,赋值时自动进行算术运算 |
| -l | 赋值时自动将值转换为小写 |
| -u | 赋值时自动将值转换为大写 |
| -n | 为变量设置引用属性(指向另一个变量) |
| -r | 将变量声明为只读(不可修改和删除) |
| -t | 为变量设置追踪属性(用于函数) |
| -x | 将变量导出为环境变量(相当于 export) |
3.3 属性删除选项
表格
| 选项 | 说明 |
|---|---|
| +a | 注意:不能用于取消数组属性 |
| +A | 注意:不能用于取消关联数组属性 |
| +i | 删除整型属性 |
| +l | 删除小写转换属性 |
| +u | 删除大写转换属性 |
| +n | 删除引用属性 |
| +t | 删除追踪属性 |
| +x | 删除导出属性 |
| +r | 注意:不能用于删除只读属性 |
4. 示例用法
4.1 基本变量声明
bash
运行
# 声明普通变量 declare my_var="Hello World" echo $my_var # 输出: Hello World # 显示变量的属性 declare -p my_var # 输出: declare -- my_var="Hello World"4.2 整型变量
bash
运行
# 声明整型变量 declare -i num=5 num=num+3 echo $num # 输出: 8 # 自动进行算术运算 declare -i a=6 b=8 result result=a+b echo $result # 输出: 144.3 大小写转换属性
bash
运行
# 自动转换为大写 declare -u upper_var="hello" echo $upper_var # 输出: HELLO # 自动转换为小写 declare -l lower_var="WORLD" echo $lower_var # 输出: world4.4 数组操作
bash
运行
# 声明索引数组 declare -a colors=("red" "green" "blue") echo ${colors[1]} # 输出: green # 声明关联数组 declare -A person person["name"]="John" person["age"]=25 echo ${person["name"]} # 输出: John4.5 只读变量
bash
运行
# 声明只读变量 declare -r readonly_var="Cannot change" readonly_var="new value" # 错误: readonly_var: readonly variable # 显示所有只读变量 declare -r4.6 导出变量
bash
运行
# 声明并导出变量 declare -x PATH="/usr/local/bin:$PATH" # 等同于 export PATH="/usr/local/bin:$PATH"4.7 函数相关操作
bash
运行
# 定义函数 function my_func() { echo "This is a function" } # 显示所有函数定义 declare -f # 仅显示函数名 declare -F # 显示特定函数 declare -f my_func4.8 在函数中使用全局变量
bash
运行
function test_func() { # 在函数内创建全局变量 declare -g global_var="I'm global" # 局部变量(函数退出后销毁) local local_var="I'm local" } test_func echo $global_var # 输出: I'm global echo $local_var # 输出: (空)5. 注意事项
5.1 重要限制
不可逆的属性:
- 数组属性(-a 或 -A)一旦设置,无法用 +a 或 +A 取消
- 只读属性(-r)一旦设置,无法删除,变量将永久存在
作用域注意:
- 在函数内部使用 declare(不带 -g)创建的变量默认是局部变量
- 在函数外部使用 declare 创建的是全局变量
属性冲突:
- 某些属性不能同时设置,如 -l(小写)和 -u(大写)
- 数组和普通变量属性互斥
5.2 最佳实践建议
明确作用域:
bash
运行
# 函数内使用 local function my_function() { local var1="local variable" declare -i var2=42 # 也是局部变量 } # 函数外使用 declare declare -r CONSTANT="value" declare -a my_array=("item1" "item2")优先使用专用命令:
- 导出变量:优先使用 export
- 只读变量:优先使用 readonly
- 局部变量:优先使用 local
这样代码意图更清晰
数组初始化:
bash
运行
# 推荐:先声明后赋值 declare -a array array=("value1" "value2") # 或者一次性完成 declare -a array=("value1" "value2")