三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Bash 脚本进阶:declare 命令完整详解(变量属性、数组、只读实战)

Bash 脚本进阶:declare 命令完整详解(变量属性、数组、只读实战)

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 # 输出: 14

4.3 大小写转换属性

bash

运行

# 自动转换为大写 declare -u upper_var="hello" echo $upper_var # 输出: HELLO # 自动转换为小写 declare -l lower_var="WORLD" echo $lower_var # 输出: world

4.4 数组操作

bash

运行

# 声明索引数组 declare -a colors=("red" "green" "blue") echo ${colors[1]} # 输出: green # 声明关联数组 declare -A person person["name"]="John" person["age"]=25 echo ${person["name"]} # 输出: John

4.5 只读变量

bash

运行

# 声明只读变量 declare -r readonly_var="Cannot change" readonly_var="new value" # 错误: readonly_var: readonly variable # 显示所有只读变量 declare -r

4.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_func

4.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")
← 返回列表