Shell学习(5/6) 流程控制-函数

九、流程控制

Shell 脚本支持常见的流程控制结构,如条件判断、循环和分支选择。

1. 条件判断

条件判断用于根据条件执行不同的代码块。Shell 中最常用的条件判断语句是 if

1.1 if 语句

基本语法
shell 复制代码
if [ 条件 ]; then
    # 条件为真时执行的代码
elif [ 其他条件 ]; then
    # 其他条件为真时执行的代码
else
    # 所有条件为假时执行的代码
fi

注意sh 的流程控制不可为空,如果 else 分支没有语句执行,就不要写这个 else

示例
shell 复制代码
#!/bin/bash

age=18

if [ "$age" -lt 18 ]; then
    echo "未成年"
elif [ "$age" -eq 18 ]; then
    echo "刚成年"
else
    echo "成年"
fi
条件表达式
  • 数值比较
    • -eq:等于
    • -ne:不等于
    • -gt:大于
    • -ge:大于等于
    • -lt:小于
    • -le:小于等于
  • 字符串比较
    • =:等于
    • !=:不等于
    • -z:字符串长度为 0
    • -n:字符串长度不为 0
  • 文件测试
    • -e:文件存在
    • -f:是普通文件
    • -d:是目录
    • -r:文件可读
    • -w:文件可写
    • -x:文件可执行

1.2 case 语句

case 语句用于多分支选择,类似于其他语言中的 switch

基本语法
shell 复制代码
case 变量 in
    模式1)
        # 匹配模式1时执行的代码
        ;;
    模式2)
        # 匹配模式2时执行的代码
        ;;
    *)
        # 默认情况
        ;;
esac
示例
shell 复制代码
#!/bin/bash

fruit="apple"

case "$fruit" in
    "apple")
        echo "这是苹果"
        ;;
    "banana")
        echo "这是香蕉"
        ;;
    *)
        echo "未知水果"
        ;;
esac

2. 循环

循环用于重复执行一段代码,直到满足某个条件。Shell 支持 forwhileuntil 循环。

2.1 for 循环

基本语法
shell 复制代码
for 变量 in 列表; do
    # 循环体
done
示例
shell 复制代码
#!/bin/bash

for i in 1 2 3 4 5; do
    echo "当前值: $i"
done
遍历文件
shell 复制代码
for file in *.txt; do
    echo "处理文件: $file"
done

当前目录下有一个 test.txt


2.2 while 循环

while 循环在条件为真时重复执行代码。

基本语法
shell 复制代码
while [ 条件 ]; do
    # 循环体
done
示例
shell 复制代码
#!/bin/bash

count=0

while [ "$count" -lt 5 ]; do
    echo "当前计数: $count"
    count=$((count + 1))
done
  • $(( )) 是进行算术运算时的正确语法。
  • $() 是用来执行命令替换,获取命令输出的结果。

2.3 until 循环

until 循环在条件为假时重复执行代码,直到条件为真。

基本语法
shell 复制代码
until [ 条件 ]; do
    # 循环体
done
示例
shell 复制代码
#!/bin/bash

count=0

until [ "$count" -ge 4 ]; do
    echo "当前计数: $count"
    count=$((count + 1))
done

2.4 循环控制

  • break:退出循环。
  • continue:跳过当前迭代,进入下一次循环。
示例
shell 复制代码
#!/bin/bash

for i in {1..10}; do
    if [ "$i" -eq 5 ]; then
        break  # 退出循环
    fi
    echo "当前值: $i"
done

十、函数

在 Shell 脚本中,函数是一种将代码封装为可重用块的方式。

1. 函数的定义

Shell 函数的定义有两种方式:

1.1 使用 function 关键字

shell 复制代码
function 函数名 {
    # 函数体
}

1.2 使用 () 定义

shell 复制代码
函数名() {
    # 函数体
}
示例
shell 复制代码
# 方式 1
function greet {
    echo "Hello, World!"
}

# 方式 2
greet() {
    echo "Hello, World!"
}

2. 函数的调用

定义函数后,可以通过函数名直接调用。

示例
shell 复制代码
greet() {
    echo "Hello, World!"
}

# 调用函数
greet

3. 函数的参数

Shell 函数可以接收参数。在函数内部,通过 $1$2$3 等访问参数。

  • $1:第一个参数
  • $2:第二个参数
  • $#:参数个数
  • $@:所有参数列表
  • $*:所有参数作为一个字符串
示例
shell 复制代码
greet() {
    echo "Hello, $1!"
}

# 调用函数并传递参数
greet "Alice"
greet "Bob"

4. 函数的返回值

Shell 函数可以通过 return 返回一个整数值(0-255),或者通过 echo 返回字符串。

4.1 使用 return 返回值

  • return 只能返回整数值。
  • 调用函数后,通过 $? 获取返回值。
示例
shell 复制代码
add() {
    local sum=$(( $1 + $2 ))
    return $sum
}

add 3 5
echo "结果是: $?"

4.2 使用 echo 返回值

  • echo 可以返回字符串或任意值。
  • 调用函数后,通过 $(函数名) 捕获返回值。

5. 局部变量

在函数内部定义的变量默认是全局的。如果希望变量只在函数内部使用,可以使用 local 关键字定义局部变量。

示例
shell 复制代码
greet() {
    local name="Alice"
    echo "Hello, $name!"
}

greet
echo "Name outside function: $name"  # 这里 $name 为空

6. 函数的嵌套

Shell 函数可以嵌套调用,即在一个函数内部调用另一个函数。

示例
shell 复制代码
greet() {
    echo "Hello, $1!"
}

introduce() {
    greet "$1"
    echo "I am a Shell script."
}

introduce "Alice"

7. 递归函数

Shell 函数支持递归调用,即函数调用自身。

示例:计算阶乘
shell 复制代码
factorial() {
    if [ "$1" -le 1 ]; then
        echo 1
    else
        local prev=$(factorial $(( $1 - 1 )))
        echo $(( $1 * prev ))
    fi
}

result=$(factorial 5)
echo "5 的阶乘是: $result"

8. 函数的返回值与状态码

  • 函数默认返回最后一条命令的退出状态码。
  • 可以通过 return 显式返回状态码(0 表示成功,非 0 表示失败)。
示例
shell 复制代码
check_file() {
    if [ -f "$1" ]; then
        echo "文件 $1 存在"
        return 0
    else
        echo "文件 $1 不存在"
        return 1
    fi
}

check_file "test.txt"
if [ "$?" -eq 0 ]; then
    echo "文件检查成功"
else
    echo "文件检查失败"
fi
相关推荐
北亚数据恢复13 分钟前
服务器数据恢复—raid5阵列硬盘出现坏道导致上层应用崩溃的数据恢复案例
服务器·数据恢复·服务器数据恢复·北亚数据恢复
小白教程28 分钟前
Python核心技术,Django学习基础入门教程(附环境安装包)
python·学习·django·django教程·django项目·django项目实战·django入门教程
HYNuyoah34 分钟前
阿里云ECS Ubuntu PPTP VPN无法访问以太网
linux·服务器·网络
Summer_341638 分钟前
Unity学习笔记之——ugui的性能优化
笔记·学习·unity
手捧向日葵的话语1 小时前
线程控制(创建、终止、等待、分离)
linux·运维·服务器
reddingtons1 小时前
在 Ubuntu 下通过 Docker 部署 Caddy 和 PHP-FPM 服务器
服务器·ubuntu·docker
李某学编程1 小时前
git命令学习记录
git·学习
nuise_1 小时前
李宏毅机器学习课程学习笔记04 | 浅谈机器学习-宝可梦、数码宝贝分类器
笔记·学习·机器学习
一小路一2 小时前
通往 AI 之路:Python 机器学习入门-数据结构
数据结构·后端·python·学习·机器学习
XiyouLinux_Kangyijie2 小时前
大模型学习笔记-基于《Deep Dive into LLMs like ChatGPT》
笔记·学习·chatgpt