【Ubuntu与Linux操作系统:九、Shell编程】

devtools/2025/1/15 21:08:42/

第9章 Shell编程


9.1 Shell编程基本步骤

Shell编程是一种通过编写脚本文件,使用Shell解释器执行批处理任务的方法。基本步骤如下:

1. 确定需求
在编写脚本之前,明确要实现的功能,例如文件备份、日志分析或自动化部署等。需求的清晰可以避免脚本逻辑冗杂。

2. 选择Shell解释器
常用的Shell包括bash(默认)、zshsh等。在脚本开头通过shebang指定解释器,例如:

#!/bin/bash

3. 创建脚本文件
使用文本编辑器(如vinano)创建脚本文件,通常以.sh结尾,以便易于识别。例如:

nano myscript.sh

4. 编写脚本代码

  • 定义变量:为数据提供临时存储。
  • 使用命令:调用系统命令完成特定任务。
  • 控制流:根据条件执行特定逻辑。
  • 函数定义:模块化脚本,提高代码复用性。

5. 修改权限
通过chmod命令赋予脚本执行权限:

chmod +x myscript.sh

6. 执行脚本
直接执行脚本:

./myscript.sh

或者通过解释器运行:

bash myscript.sh

7. 测试与调试

  • 在执行脚本之前,逐行检查逻辑。
  • 使用set -x开启调试模式,查看每条命令的执行结果。

Shell编程的步骤清晰且具有较高灵活性,可以帮助用户快速实现自动化任务。


9.2 Shell变量

Shell变量用于存储数据,分为局部变量和环境变量两种。

1. 变量的定义与使用
定义变量时无需声明类型,直接赋值即可,例如:

name="Ubuntu"
echo $name

注意,等号两侧不能有空格,引用变量时需加$

2. 变量类型

  • 局部变量:仅在当前Shell中有效,默认所有变量为局部变量。

  • 环境变量:在Shell和其子进程中共享,使用export声明:

    export PATH=$PATH:/new/path
    

3. 只读变量
变量定义后不允许修改,可使用readonly命令:

readonly pi=3.14

4. 特殊变量

  • $0:脚本文件名。
  • $1-$9:传递给脚本的参数。
  • $#:参数个数。
  • $@:所有参数。
  • $$:当前脚本进程ID。

5. 数组变量
Shell支持一维数组,可以通过以下方式定义和访问:

arr=(one two three)
echo ${arr[1]} # 输出:two

Shell变量的灵活性使其成为脚本中处理数据的重要工具。


9.3 表达式与运算符

Shell支持多种运算符,用于执行数学计算和逻辑判断。

1. 算术运算
使用$(( ))expr进行计算,例如:

result=$((5 + 3))
echo $result # 输出8

使用expr

result=$(expr 5 \* 3)

2. 关系运算符
用于比较数字,常见运算符包括:

  • -eq:等于
  • -ne:不等于
  • -gt:大于
  • -lt:小于

示例:

if [ $a -gt $b ]; then echo "a大于b"; fi

3. 字符串运算

  • =:字符串相等
  • !=:字符串不等
  • -z:字符串长度为0
  • -n:字符串长度非0

4. 逻辑运算

  • &&:逻辑与
  • ||:逻辑或
  • !:逻辑非

5. 文件测试运算

  • -e:文件存在
  • -f:是普通文件
  • -d:是目录

Shell运算符的丰富性,提供了编写复杂逻辑脚本的能力。


9.4 流程控制语句

流程控制语句决定脚本的执行顺序,包括条件判断和循环。

1. 条件判断

  • if-else语句

    if [ $a -gt $b ]; thenecho "a大于b"
    elseecho "a小于等于b"
    fi
    
  • case语句:多分支条件判断:

    case $var in1) echo "Option 1";;2) echo "Option 2";;*) echo "Other option";;
    esac
    

2. 循环语句

  • for循环:遍历列表:

    for item in one two three; doecho $item
    done
    
  • while循环:条件为真时执行:

    while [ $count -lt 5 ]; doecho $countcount=$((count + 1))
    done
    
  • until循环:条件为假时执行:

    until [ $count -ge 5 ]; doecho $countcount=$((count + 1))
    done
    

Shell的流程控制语句提供了灵活的脚本逻辑控制能力。


9.5 函数

函数是Shell脚本中的模块化工具,用于封装一组指令,增强代码复用性和可维护性。

1. 函数定义与调用
函数定义时无需声明返回类型:

my_function() {echo "Hello, $1"
}
my_function "World"

2. 函数参数
函数可接收参数,通过$1, $2访问:

add() {echo $(( $1 + $2 ))
}
add 5 3 # 输出8

3. 返回值
Shell函数返回值通过return指定(0表示成功,非0表示失败),或通过echo输出:

get_value() {echo $(( $1 * 2 ))
}
result=$(get_value 5)

4. 函数库
可将常用函数定义在单独文件中,通过source.引入:

source my_functions.sh

Shell函数提升了脚本的组织能力,尤其适合复杂任务的处理和分解。


http://www.ppmy.cn/devtools/150760.html

相关文章

【Uniapp-Vue3】Prop校验与prop默认值用法及循环遍历数组对象

一、prop校验 如果我们在想要限制prop的类型,就可以在接收prop的时候对接收类型进行限制: defineProps({ 属性名:{ type:类型 } }) 需要注意类型的首字母大写 但是设置了传入参数类型限制并不能严格限制,只会在后台进行提示: 二、…

懒汉式单例模式

懒汉式单例是一种在需要时才会初始化实例的单例模式实现方式,适用于需要延迟加载的场景。以下是一个实际使用懒汉式单例的例子,并结合适用场景进行解析。 示例场景:日志管理器 在开发过程中,日志记录是一个常见需求,通…

fastgpt 调用api 调试 写 localhost, 127.0.0.1不行,要 ipconfig 找到本机ip

fastgpt 调用api 调试 写 localhost, 127.0.0.1不行,要 ipconfig 找到本机ip IPv4 地址 . . . . . . . . . . . . : 192.168.1.2

在vscode中使用R-1

参考我的上一篇博客: https://blog.csdn.net/weixin_62528784/article/details/145092632?spm1001.2014.3001.5501 这篇内容实际上就是上一篇博客的后续承接,既然都在vscode的jupyter中使用R了,实际上其实也能够直接在vscode中原生使用R的编…

NHANES数据挖掘|特征变量对死亡率预测的研究设计与分析

书接上回,应各位临床或在科室的小伙伴们需求,除了多组学和算法开发外,插播关于临床护理方向的数据挖掘,今天分享两篇NHANES的分析文献。 1、时依中介分析 DOI: 10.1186/s12933-024-02191-5 整体思路 基于 NHANES 数据…

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址(Internet Protocol Address)是指互联网协议地址。 它是分配给连接到互联网的设备(如计算机、服务器、智能手机…

机器学习 - 常用的损失函数(0-1、平方)

损失函数是一个非负实数函数,用来量化模型预测和真实标签之间的差异. 下面介绍几种常用的损失函数. 一、0-1损失函数 在机器学习和统计学中,0-1损失函数是一种简单而直观的损失函数,用于衡量预测值是否与实际值一致。其公式定义为&#xf…

mysql概述

sql的定义: sql(Structured Query Language):结构化查询语言 sql的分类: DDL(Data Definition Language): 数据定义语言——定义对数据库对象(库,表&…