【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[@]}"; do
    echo "颜色: $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.sh

declare -A config

while IFS='=' read -r key value; do
    [[ $key =~ ^# ]] || [[ -z $key ]] && continue
    config["$key"]="$value"
done < config.ini

echo "DB_HOST: ${config[db_host]}"
echo "DB_USER: ${config[db_user]}"

案例2:字符串加密工具

#!/bin/bash
# string_encoder.sh

read -p "输入要加密的字符串: " input

# 简单的ROT13加密
rot13() {
    echo "$1" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
}

encoded=$(rot13 "$input")
echo "加密结果: $encoded"

6. 最佳实践与常见陷阱

6.1 必须遵循的规范

  1. 变量命名规则:

    • 全大写:环境变量和常量 (MAX_RETRY)
    • 小写下划线:局部变量 (local tmp_file)
    • 避免使用连字符
  2. 引用规范:

    # 正确
    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变量的值

学习资源推荐

  1. Bash 参考手册:man bash
  2. Google Shell 风格指南
  3. Bash 脚本调试工具:bashdb

本章总结

本章深入探讨了 Shell 脚本中变量和字符串的各种操作技巧,从基础定义到高级用法,包括:

  • 变量的声明、引用和作用域规则
  • 环境变量的管理方法
  • 字符串的各类处理操作
  • 数组和关联数组的使用
  • 实际应用案例和最佳实践

💡 下章:第三章将深入讲解流程控制结构,包括条件判断、循环和case语句,带您掌握Shell脚本的逻辑控制能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值