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

第9章 Shell编程


9.1 Shell编程基本步骤

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

1. 确定需求

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

2. 选择Shell解释器

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

bash 复制代码
#!/bin/bash

3. 创建脚本文件

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

bash 复制代码
nano myscript.sh

4. 编写脚本代码

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

5. 修改权限

通过chmod命令赋予脚本执行权限:

bash 复制代码
chmod +x myscript.sh

6. 执行脚本

直接执行脚本:

bash 复制代码
./myscript.sh

或者通过解释器运行:

bash 复制代码
bash myscript.sh

7. 测试与调试

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

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


9.2 Shell变量

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

1. 变量的定义与使用

定义变量时无需声明类型,直接赋值即可,例如:

bash 复制代码
name="Ubuntu"
echo $name

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

2. 变量类型

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

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

    bash 复制代码
    export PATH=$PATH:/new/path

3. 只读变量

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

bash 复制代码
readonly pi=3.14

4. 特殊变量

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

5. 数组变量

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

bash 复制代码
arr=(one two three)
echo ${arr[1]} # 输出:two

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


9.3 表达式与运算符

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

1. 算术运算

使用$(( ))expr进行计算,例如:

bash 复制代码
result=$((5 + 3))
echo $result # 输出8

使用expr

bash 复制代码
result=$(expr 5 \* 3)

2. 关系运算符

用于比较数字,常见运算符包括:

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

示例:

bash 复制代码
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语句

    bash 复制代码
    if [ $a -gt $b ]; then
      echo "a大于b"
    else
      echo "a小于等于b"
    fi
  • case语句:多分支条件判断:

    bash 复制代码
    case $var in
      1) echo "Option 1";;
      2) echo "Option 2";;
      *) echo "Other option";;
    esac

2. 循环语句

  • for循环:遍历列表:

    bash 复制代码
    for item in one two three; do
      echo $item
    done
  • while循环:条件为真时执行:

    bash 复制代码
    while [ $count -lt 5 ]; do
      echo $count
      count=$((count + 1))
    done
  • until循环:条件为假时执行:

    bash 复制代码
    until [ $count -ge 5 ]; do
      echo $count
      count=$((count + 1))
    done

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


9.5 函数

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

1. 函数定义与调用

函数定义时无需声明返回类型:

bash 复制代码
my_function() {
  echo "Hello, $1"
}
my_function "World"

2. 函数参数

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

bash 复制代码
add() {
  echo $(( $1 + $2 ))
}
add 5 3 # 输出8

3. 返回值

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

bash 复制代码
get_value() {
  echo $(( $1 * 2 ))
}
result=$(get_value 5)

4. 函数库

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

bash 复制代码
source my_functions.sh

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

相关推荐
无聊的小坏坏35 分钟前
从单 Reactor 线程池到 OneThreadOneLoop:高性能网络模型的演进
服务器·网络·一个线程一个事件循环
cynicme36 分钟前
力扣3228——将 1 移动到末尾的最大操作次数
算法·leetcode
熬了夜的程序员36 分钟前
【LeetCode】109. 有序链表转换二叉搜索树
数据结构·算法·leetcode·链表·职场和发展·深度优先
随意起个昵称1 小时前
【递归】二进制字符串中的第K位
c++·算法
AI智域边界 - Alvin Cho1 小时前
Bloomberg、LSEG 与 MCP 缺口:为什么尚未发布完整的 MCP 服务器,以及多智能体系统如何解決这问题
运维·服务器
人间打气筒(Ada)1 小时前
zerotier内网穿透部署(rockylinux部署本地服务器)超详细~~~
linux·内网穿透·内网·公网·zerotier·穿透
mjhcsp2 小时前
C++ 循环结构:控制程序重复执行的核心机制
开发语言·c++·算法
立志成为大牛的小牛2 小时前
数据结构——四十一、分块查找(索引顺序查找)(王道408)
数据结构·学习·程序人生·考研·算法
剑动山河2 小时前
ubuntu 升级mysql由mysql5.7.42 升级到8.4.0
mysql·ubuntu·adb
xier_ran2 小时前
深度学习:RMSprop 优化算法详解
人工智能·深度学习·算法