【Shell 脚本编程】详细指南:第二章 - 变量与字符串操作
Shell 脚本编程详细指南:第二章 - 变量与字符串操作
引言:变量在 Shell 脚本中的核心地位
变量是任何编程语言的基础构建块,Shell 脚本中的变量处理有其独特的特性和强大的功能。本章将全面剖析 Shell 变量的各种用法和字符串操作的高级技巧,帮助您编写更健壮、更高效的脚本。
1. 变量基础与高级特性
1.1 变量声明与引用规范
标准声明方式:
variable_name="value" # 等号两侧无空格
PI=3.14159
正确引用方式对比:
echo $variable # 基本引用(简单场景)
echo "${variable}" # 推荐方式(避免歧义)
echo "圆周率: ${PI}" # 变量嵌入字符串
危险示例与修正:
# 错误示例(变量名后直接跟字符)
echo "$variable123" # 尝试读取variable123变量# 正确写法
echo "${variable}123"
1.2 变量类型检查与操作
类型检测技巧:
declare -p variable_name 2>/dev/null | grep -q "declare" && echo "存在" || echo "未定义"
只读变量实际应用:
readonly MAX_RETRY=3
readonly CONFIG_FILE="/etc/app.conf"# 尝试修改会报错
MAX_RETRY=5 # 错误: readonly variable
unset 的高级用法:
unset -v var1 var2 # 明确指定取消变量(而非函数)
2. 变量作用域详解
2.1 作用域对比表
变量类型 | 声明方式 | 作用范围 | 子进程可见性 |
---|---|---|---|
局部变量 | local var=value | 当前函数内 | 不可见 |
全局变量 | var=value | 当前脚本 | 不可见 |
环境变量 | export var=value | 当前进程及其子进程 | 可见 |
2.2 环境变量管理实战
查看特定环境变量:
echo $PATH
printenv HOME
临时添加PATH:
export PATH="$PATH:/usr/local/custom/bin"
永久生效方法(写入配置文件):
echo 'export JAVA_HOME="/usr/lib/jvm/java-11"' >> ~/.bashrc
source ~/.bashrc
3. 字符串操作大全
3.1 字符串处理功能对照表
操作类型 | 语法示例 | 功能描述 |
---|---|---|
长度获取 | ${#str} | 获取字符串长度 |
子串提取 | ${str:position:length} | 从指定位置提取子串 |
模式替换 | ${str/substring/replace} | 替换第一个匹配项 |
全局替换 | ${str//substring/replace} | 替换所有匹配项 |
前缀删除 | ${str#prefix} | 删除最短匹配前缀 |
后缀删除 | ${str%suffix} | 删除最短匹配后缀 |
3.2 实际应用案例
文件名处理:
file_path="/var/log/app.log"
echo "文件名: ${file_path##*/}" # app.log
echo "目录名: ${file_path%/*}" # /var/log
URL解析:
url="https://example.com/path/to/page?query=string"
protocol="${url%%://*}" # https
domain="${url#*://}" # example.com/path/to/page?query=string
domain="${domain%%/*}" # example.com
4. 数组变量介绍
4.1 基础数组操作
声明与初始化:
colors=("red" "green" "blue")
numbers=(1 2 3 4 5)
访问元素:
echo ${colors[0]} # 第一个元素(索引从0开始)
echo ${colors[@]} # 所有元素
数组遍历:
for color in "${colors[@]}"; doecho "颜色: $color"
done
4.2 关联数组(Bash 4.0+)
声明与使用:
declare -A user
user=(["name"]="Alice" ["age"]=25 ["email"]="alice@example.com")echo "用户名: ${user[name]}"
echo "年龄: ${user[age]}"
5. 实战案例解析
案例1:配置文件解析器
#!/bin/bash
# config_parser.shdeclare -A configwhile IFS='=' read -r key value; do[[ $key =~ ^# ]] || [[ -z $key ]] && continueconfig["$key"]="$value"
done < config.iniecho "DB_HOST: ${config[db_host]}"
echo "DB_USER: ${config[db_user]}"
案例2:字符串加密工具
#!/bin/bash
# string_encoder.shread -p "输入要加密的字符串: " input# 简单的ROT13加密
rot13() {echo "$1" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
}encoded=$(rot13 "$input")
echo "加密结果: $encoded"
6. 最佳实践与常见陷阱
6.1 必须遵循的规范
-
变量命名规则:
- 全大写:环境变量和常量 (
MAX_RETRY
) - 小写下划线:局部变量 (
local tmp_file
) - 避免使用连字符
- 全大写:环境变量和常量 (
-
引用规范:
# 正确 cp "$source" "$dest"# 危险 cp $source $dest
6.2 常见错误排查
问题1:变量赋值无效
# 错误:等号两边有空格
var = "value" # 会被解释为命令var带参数# 正确
var="value"
问题2:特殊字符处理
# 错误:包含空格未加引号
message=Hello World # 尝试赋值"Hello"到变量message,World作为命令# 正确
message="Hello World"
进阶技巧
变量默认值处理
# 如果变量未设置,使用默认值
echo "${NAME:-Anonymous}"# 如果变量未设置,设置并导出
: ${HOST:=localhost}
间接引用
var_name="PATH"
echo "Value: ${!var_name}" # 输出PATH变量的值
学习资源推荐
- Bash 参考手册:
man bash
- Google Shell 风格指南
- Bash 脚本调试工具:
bashdb
本章总结
本章深入探讨了 Shell 脚本中变量和字符串的各种操作技巧,从基础定义到高级用法,包括:
- 变量的声明、引用和作用域规则
- 环境变量的管理方法
- 字符串的各类处理操作
- 数组和关联数组的使用
- 实际应用案例和最佳实践
💡 下章:第三章将深入讲解流程控制结构,包括条件判断、循环和case语句,带您掌握Shell脚本的逻辑控制能力。