case分支、函数和数组

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"
    • 通配符:*.shfile*
    • 字符范围:[0-9][Yy])
    • 多个模式:pattern1|pattern2
  • 命令序列1:当匹配成功时要执行的命令
  • ;;双分号,表示该分支结束,必须要有!

3. 默认分支

*)
    默认命令序列
    ;;
  • *):通配符,匹配任何其他情况
  • 相当于其他语言中的 default 分支

4. case 结束

esac
  • esaccase 的倒写,表示 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 和 5
  • echo "结果:$?"$? 获取函数返回值

执行结果:

结果: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编程之路上的忠实伙伴,助您在自动化运维和系统管理的道路上越走越远,让代码为您创造更多价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值