Bootstrap

【linux】(28)shell-作用域和变量操作

作用域

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 "上一个命令的退出状态: $?"
;