作用域
Shell 变量作用域详解
在 Shell 脚本中,变量的作用域决定了变量在哪些地方可以被访问和使用。变量的作用域主要分为全局变量和局部变量两种。
1. 全局变量
全局变量在整个脚本的范围内都可访问,默认情况下所有在脚本中定义的变量都是全局的。
示例:全局变量
#!/bin/bash
# 定义全局变量
global_var="这是全局变量"
# 定义一个函数
my_function() {
echo "在函数中访问全局变量: $global_var"
}
# 调用函数
my_function
# 在函数外访问全局变量
echo "在函数外访问全局变量: $global_var"
输出:
在函数中访问全局变量: 这是全局变量
在函数外访问全局变量: 这是全局变量
2. 局部变量
局部变量只在某个函数内部有效。使用 local
关键字定义局部变量。
示例:局部变量
#!/bin/bash
# 定义全局变量
global_var="全局变量"
# 定义函数
my_function() {
local local_var="这是局部变量"
echo "函数内部访问局部变量: $local_var"
echo "函数内部访问全局变量: $global_var"
}
# 调用函数
my_function
# 在函数外尝试访问局部变量
echo "函数外访问局部变量: $local_var" # 不会输出内容,因为 $local_var 在函数外不可见
输出:
函数内部访问局部变量: 这是局部变量
函数内部访问全局变量: 全局变量
函数外访问局部变量: # 空白
3. 函数内对全局变量的修改
在函数中可以修改全局变量,但要注意作用域的管理,以避免意外修改。
示例:修改全局变量
#!/bin/bash
global_var="初始值"
modify_global() {
global_var="被修改的全局变量"
}
echo "调用函数前: $global_var"
modify_global
echo "调用函数后: $global_var"
输出:
调用函数前: 初始值
调用函数后: 被修改的全局变量
4. 导出环境变量
环境变量在父进程中定义,并可以被子进程继承。使用 export
命令导出全局变量到子进程中。
示例:环境变量
#!/bin/bash
export my_env_var="我是环境变量"
# 启动子 Shell 查看变量
bash -c 'echo "子Shell访问环境变量: $my_env_var"'
输出:
子Shell访问环境变量: 我是环境变量
字符串操作
获取字符串长度:
#!/bin/bash
str="Hello, World!"
echo "字符串长度: ${#str}" # 输出: 13
子字符串提取:
#!/bin/bash
str="Hello, World!"
echo "提取子字符串: ${str:7:5}" # 输出: World
子字符串替换:
#!/bin/bash
str="Hello, World!"
echo "${str/World/Girl}" # 替换第一次出现的 "World"
删除匹配内容:
#!/bin/bash
file="/path/to/file.txt"
echo "${file##*/}" # 删除最短匹配前缀,输出: file.txt
echo "${file%%.*}" # 删除扩展名,输出: /path/to/file
数组操作
定义数组:
#!/bin/bash
fruits=("apple" "banana" "cherry")
访问数组元素:
echo "第一个元素: ${fruits[0]}" # 输出: apple
获取所有元素:
echo "所有元素: ${fruits[@]}"
获取数组长度:
echo "数组长度: ${#fruits[@]}" # 输出: 3
添加元素:
fruits+=("grape")
echo "添加后数组: ${fruits[@]}"
遍历数组:
for fruit in "${fruits[@]}"; do
echo "$fruit"
done
数值操作
Shell 默认处理字符串,但也支持算术运算:
基本算术操作:
a=10
b=5
echo "加法: $((a + b))"
echo "减法: $((a - b))"
echo "乘法: $((a * b))"
echo "除法: $((a / b))"
使用 let
命令:
let result=a+b
echo "结果: $result"
使用 expr
:
result=$(expr $a + $b)
echo "结果: $result"
命令行参数操作
#!/bin/bash
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "所有参数: $@"
echo "参数数量: $#"
特殊变量
变量 | 描述 |
---|---|
$0 | 脚本名称 |
$# | 参数个数 |
$@ | 所有参数(每个参数独立引用) |
$* | 所有参数(所有参数当作单个字符串) |
$$ | 当前脚本的进程ID |
$? | 上一个命令的退出状态 |
$! | 最近后台运行的进程ID |
$- | 当前 shell 选项 |
示例脚本:结合变量与逻辑操作
#!/bin/bash
# 定义变量
name="Alice"
age=30
fruits=("apple" "banana" "cherry")
# 字符串操作
greeting="Hello, World!"
echo "姓名: $name"
echo "年龄: $age"
echo "问候: ${greeting}"
echo "问候长度: ${#greeting}"
echo "子字符串: ${greeting:7:5}"
# 数组操作
echo "第一个水果: ${fruits[0]}"
echo "所有水果: ${fruits[@]}"
echo "水果数量: ${#fruits[@]}"
# 条件判断
if [ $age -ge 18 ]; then
echo "$name 是成年人"
else
echo "$name 未成年"
fi
# 命令行参数
echo "脚本名称: $0"
echo "参数数量: $#"
echo "所有参数: $@"
# 退出状态
ls /nonexistentfile
echo "上一个命令的退出状态: $?"