在 Linux Shell 脚本编程中,数组和函数是两个非常强大的工具。单独使用它们已经能解决很多问题,但如果将它们结合起来,就能编写出更加模块化、可读性更高、复用性更强的脚本。本文将手把手教你如何在 Shell 中使用数组,并将其与函数结合,即使是刚接触 Shell 的小白也能轻松上手。
Shell 数组是一种可以存储多个值的变量类型。在 Bash(最常用的 Shell)中,数组默认是索引数组(从 0 开始),也可以使用关联数组(类似字典,用字符串作为键)。
# 定义数组fruits=("苹果" "香蕉" "橙子")# 访问单个元素echo ${fruits[0]} # 输出:苹果# 访问所有元素echo ${fruits[@]} # 输出:苹果 香蕉 橙子# 获取数组长度echo ${#fruits[@]} # 输出:3 函数是一段可重复使用的代码块。在 Shell 中定义函数非常简单,不需要声明返回类型或参数类型。
# 定义函数greet() { echo "你好,$1!"}# 调用函数greet "小明" # 输出:你好,小明! 这是很多初学者容易困惑的地方:Shell 函数不能直接“接收”一个数组作为参数,但我们可以通过传递数组的所有元素来实现类似效果。
# 定义打印数组的函数print_array() { local arr=($@) # 将传入的所有参数视为数组 for item in "${arr[@]}"; do echo "- $item" done}# 定义一个数组colors=("红" "绿" "蓝")# 调用函数并传入数组print_array "${colors[@]}"# 输出:# - 红# - 绿# - 蓝 注意:"${colors[@]}" 是关键!它会将数组的每个元素作为独立参数传递给函数。
Shell 函数不能直接返回数组,但可以通过以下两种方式“返回”:
echo 输出,再用命令替换捕获# 方法一:使用全局变量get_even_numbers() { local input=($@) result=() # 全局数组 for num in "${input[@]}"; do if (( num % 2 == 0 )); then result+=("$num") fi done}numbers=(1 2 3 4 5 6)get_even_numbers "${numbers[@]}"echo "偶数有:${result[@]}" # 输出:偶数有:2 4 6 # 方法二:通过 echo 返回(适合简单场景)get_uppercase() { for word in "$@"; do echo "${word^^}" # 转大写 done}words=("hello" "world")# 使用命令替换捕获输出,并构建新数组uppercase_words=($(get_uppercase "${words[@]}"))echo "大写:${uppercase_words[@]}" # 输出:大写:HELLO WORLD 假设你有一组文件名,想统一加上前缀。我们可以用数组存储文件名,用函数处理。
# 添加前缀的函数add_prefix() { local prefix="$1" shift # 移除第一个参数(前缀),剩下的就是文件名数组 local files=($@) for file in "${files[@]}"; do echo "${prefix}_${file}" done}# 原始文件名files=("report.txt" "data.csv" "image.png")# 调用函数new_files=($(add_prefix "backup" "${files[@]}"))# 打印结果for f in "${new_files[@]}"; do echo "$f"done# 输出:# backup_report.txt# backup_data.csv# backup_image.png 通过本文,你已经掌握了 Linux Shell数组 和 Shell函数 的基本用法,并学会了如何将它们结合起来编写更强大的脚本。记住几个关键点:
"${array[@]}" 传递整个数组local arr=($@) 接收数组echo + 命令替换掌握这些技巧后,你的 Shell脚本编程 能力将大幅提升。多练习、多尝试,你会发现 Shell数组与函数结合 的应用场景非常广泛,比如日志分析、批量重命名、自动化部署等。
—— 学完记得动手写几个脚本巩固哦!——
本文由主机测评网于2025-11-30发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025111445.html