case分支、函数和数组
前言
在当今信息技术飞速发展的时代,Shell编程作为连接用户与操作系统核心的桥梁,始终保持着不可替代的重要地位。无论是系统运维、自动化脚本编写,还是日常任务的高效处理,掌握Shell编程都成为IT从业者必备的核心技能之一。本指南系统性地梳理了Shell编程的完整知识体系,从最基础的环境搭建、脚本编写,到变量使用、流程控制、函数定义,再到数组操作和文件包含等高级特性,每个知识点都配有详实的案例说明和实践指导。我们不仅注重语法的讲解,更关注实际应用场景,通过真实可运行的代码示例,帮助读者深入理解Shell编程的精髓。无论您是刚入门的初学者,还是希望系统提升Shell编程能力的开发人员,相信本指南都能为您提供清晰的学习路径和实践参考,助您在Linux/Unix世界中游刃有余,轻松应对各种自动化管理和脚本开发挑战。
一、case分支
case格式说明
case 变量值 in
模式1)
命令序列
;;
模式2)
命令序列
;;
…
模式n)
命令序列
;;
*)
默认命令序列
;;
esac
语法结构详解
1. case 开头
case 变量值 in
case:关键字,表示开始一个多分支判断变量值:要匹配的变量或值in:关键字,表示开始匹配模式列表
2. 模式匹配部分
模式1)
命令序列1
;;
模式1):匹配模式,可以是:- 具体值:
"start"、"stop" - 通配符:
*.sh、file* - 字符范围:
[0-9]、[Yy]) - 多个模式:
pattern1|pattern2
- 具体值:
命令序列1:当匹配成功时要执行的命令;;:双分号,表示该分支结束,必须要有!
3. 默认分支
*)
默认命令序列
;;
*):通配符,匹配任何其他情况- 相当于其他语言中的
default分支
4. case 结束
esac
esac:case的倒写,表示 case 语句结束
#!/bin/bash
case $1 in
"start")
echo "启动服务..."
systemctl start nginx
;;
"stop")
echo "停止服务..."
systemctl stop nginx
;;
"restart")
echo "重启服务..."
systemctl restart nginx
;;
"status")
echo "查看状态..."
systemctl status nginx
;;
*) # 默认情况
echo "用法: $0 {start|stop|restart|status}"
exit 1
;;
esac
二、函数
函数:可以理解为是一个功能。例: print
好处:当有了解决某个问题的函数(功能)时,程序员就可以直接调用这个函数直接解决问题
1.函数格式说明
function 函数名称 ()
{
程序段;
[return int;]
}
可以带 function fun() 定义,也可以直接 fun() 定义, 不带任何参数。
参数返回,可以显示加 return ,如果不加,将以最后一条命令运行结果,作为返回值
2.最简单的函数
#!/bin/bash
### 演示函数的简单使用
### 注意:函数书写在shell脚本的开始位置
### 定义函数,函数名为:print
function print()
{
echo "hello"
echo "你好"
}
### 调用print函数
print
代码说明:
function print():定义名为 print 的函数{ ... }:函数体,包含要执行的命令echo "hello":输出英文问候echo "你好":输出中文问候print:调用函数,只需要写函数名
执行结果:
hello
你好
3.带参数的函数
funwithParam()
{
echo “第一个参数为 $1”
echo “第二个参数为 $2”
echo “第十个参数为 $10”
echo “第十个参数为 ${10}”
echo “第十一个参数为 ${11}”
echo “参数总数有 $# 个”
echo “作为一个字符串输出所有参数 $*”
}
调用函数,并传递参数
funwithParam 1 2 3 4 5 6 7 8 9 34 73
一、函数的返回值详解
📌 返回值的基本概念
函数的返回值:函数内部在处理完所有问题后,需要有一个结果返回给调用者。
特点:
- 使用
return语句返回数据 - 返回值只能是数值(0-255)
- 通过
$?获取返回值 - 每次只能返回一个值
三、返回值的基本语法
1. 基本格式
function 函数名(){
...
函数体中的代码
...
return 数据 ## 返回的数据只能有一个值
}
2. 获取返回值
函数名 参数1 参数2
echo "返回值:$?" # $? 获取上一条命令的返回值
四、基础示例解析
示例1:简单的加法函数
#!/bin/bash
function add() {
return $(($1 + $2))
}
add 3 5
echo "结果:$?" # $? 获取返回值
代码说明:
return $(($1 + $2)):计算 $1 + $2 的结果并通过 return 返回add 3 5:调用函数,传递参数 3 和 5echo "结果:$?":$?获取函数返回值
执行结果:
结果:8
五、数组的基本概念
📌 什么是数组?
数组:可以理解为是一个用来存放多个值的容器。
专业定义:数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用。
特点:
- 数组中存储的数据称为:元素
- 每个元素有一个编号(索引),从 0 开始
- Bash Shell 只支持一维数组
- 初始化时不需要定义数组大小
1.数组的定义方式
1. 直接定义(最常用)
array_name=(value1 value2 value3 ... valueN)
示例:
#!/bin/bash
my_array=(A B "C" D)
2. 索引定义
# 数组名[索引]=元素值
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
示例:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]="C"
my_array[3]=D
3. 从变量定义
list="11 12 13 14"
num=($list)
4. 从命令结果定义
num=(`cat /etc/passwd`)
2、数组的分类
1. 普通数组
- 不需要声明直接定义
- 下标索引只能是整数
- 示例:
num=(11 22 33 44)
2. 关联数组
- 需要用
declare -A声明 - 索引可以是字符串
- 示例:
declare -A student
student["name"]="张三"
student["age"]=20
3.数组的读取操作
1. 读取单个元素
${array_name[index]}
示例:
#!/bin/bash
my_array=(A B "C" D)
echo "第一个元素为:${my_array[0]}" # A
echo "第二个元素为:${my_array[1]}" # B
echo "第三个元素为:${my_array[2]}" # C
echo "第四个元素为:${my_array[3]}" # D
2. 读取所有元素
# 两种方式等价
${array_name[@]}
${array_name[*]}
示例:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素为:${my_array[*]}" # A B C D
echo "数组的元素为:${my_array[@]}" # A B C D
3. 获取数组长度
${#array_name[@]}
${#array_name[*]}
示例:
#!/bin/bash
arr=("A" "B" "C")
echo "数组长度:${#arr[@]}" # 输出:3
4.数组的遍历
方法1:直接遍历元素
#!/bin/bash
# 定义数组
my_arr=(AA BB CC)
# 利用for循环遍历数组
for var in ${my_arr[*]}
do
echo $var
done
执行结果:
AA
BB
CC
方法2:通过索引遍历
#!/bin/bash
my_arr=(AA BB CC)
my_arr_num=${#my_arr[*]} # 获取数组的长度
for((i=0; i<my_arr_num; i++))
do
echo ${my_arr[$i]}
done
执行结果:
AA
BB
CC
方法3:使用 @ 符号(推荐)
#!/bin/bash
arr=("Apple" "Banana" "Orange")
for element in "${arr[@]}"; do
echo $element
done
5.完整示例演示
示例1:基础数组操作
#!/bin/bash
# 定义数组
fruits=("苹果" "香蕉" "橙子" "葡萄")
# 读取操作
echo "所有水果: ${fruits[@]}"
echo "数组长度: ${#fruits[@]}"
echo "第一个水果: ${fruits[0]}"
echo "最后一个水果: ${fruits[${#fruits[@]}-1]}"
# 遍历数组
echo "=== 水果列表 ==="
for fruit in "${fruits[@]}"; do
echo "- $fruit"
done
执行结果:
所有水果: 苹果 香蕉 橙子 葡萄
数组长度: 4
第一个水果: 苹果
最后一个水果: 葡萄
=== 水果列表 ===
- 苹果
- 香蕉
- 橙子
- 葡萄
总结
Shell编程作为Linux/Unix系统的核心技能,其价值在于将复杂的系统操作转化为简洁高效的自动化脚本。通过本指南的学习,我们不仅掌握了从基础变量、流程控制到函数、数组等核心语法,更重要的是培养了将日常任务转化为自动化解决方案的思维方式。真正的Shell编程高手不是死记硬背语法规则,而是能够灵活运用这些工具解决实际问题。记住,优秀的脚本往往不是最复杂的,而是最实用的——清晰可读、稳定可靠、易于维护。希望本指南能成为您Shell编程之路上的忠实伙伴,助您在自动化运维和系统管理的道路上越走越远,让代码为您创造更多价值。
705

被折叠的 条评论
为什么被折叠?



