当前位置: 首页 > article >正文

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

九、流程控制

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

1. 条件判断

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

1.1 if 语句

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

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

示例
#!/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

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

fruit="apple"

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


2. 循环

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

2.1 for 循环

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

for i in 1 2 3 4 5; do
    echo "当前值: $i"
done

遍历文件
for file in *.txt; do
    echo "处理文件: $file"
done

当前目录下有一个 test.txt


2.2 while 循环

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

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

count=0

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


2.3 until 循环

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

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

count=0

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


2.4 循环控制

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

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


十、函数

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

1. 函数的定义

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

1.1 使用 function 关键字

function 函数名 {
    # 函数体
}

1.2 使用 () 定义

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

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

2. 函数的调用

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

示例
greet() {
    echo "Hello, World!"
}

# 调用函数
greet


3. 函数的参数

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

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

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


4. 函数的返回值

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

4.1 使用 return 返回值

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

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

4.2 使用 echo 返回值

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


5. 局部变量

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

示例
greet() {
    local name="Alice"
    echo "Hello, $name!"
}

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


6. 函数的嵌套

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

示例
greet() {
    echo "Hello, $1!"
}

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

introduce "Alice"


7. 递归函数

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 表示失败)。
示例
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


http://www.kler.cn/a/566770.html

相关文章:

  • 数据结构秘籍(二)图(含图的概念、存储以及图的两大搜索)
  • 无人机定点运输技术!
  • CSS 系列之:grid 布局
  • Windows环境下安装Redis并设置Redis开机自启
  • React进阶之前端业务Hooks库(三)
  • docker部署go简单web项目(无mysql等附加功能)
  • React组件化深度解析(二):从受控组件到生命周期现代化
  • 【Wireshark 02】抓包过滤方法
  • 三十、Helm和Operator
  • PDF文档中表格以及形状解析
  • 密码学(哈希函数)
  • 3-4 WPS JS宏 工作表的新建、删除与错务内容处理(批量新建工作表)学习笔记
  • 【考试大纲】高级系统架构设计师考试大纲
  • uniapp中使用leaferui使用Canvas绘制复杂异形表格的实现方法
  • Angular从入门到精通教程篇章
  • 多个pdf合并成一个pdf的方法
  • MySQL当中的Lock
  • Gatling介绍
  • k8s出问题后 应该查看哪些内容
  • 【Leetcode 每日一题】2353. 设计食物评分系统