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

Shell编程入门到实战:从基础语法到自动化脚本

在Linux世界中,Shell是用户与内核之间的"翻译官",它接收用户输入的命令,解释并传递给操作系统执行,再将结果反馈给用户。这种交互既可以是实时输入命令的交互式操作,也可以是通过脚本文件批量执行的非交互式操作。

1.1 Shell的本质与分类

Shell本质上是一个命令解释器程序,用C语言编写而成。常见的Shell解释器包括:

  • bash:大多数Linux发行版(如CentOS、RedHat)的默认Shell,兼容sh且功能更丰富
  • sh:早期的Bourne Shell,很多系统中已作为bash的软链接
  • csh/tcsh:类C语言语法的Shell
  • zsh:功能强大的增强型Shell,兼容bash

通过cat /etc/shells命令可查看系统支持的所有Shell类型,而/etc/passwd文件记录了用户默认使用的Shell。

1.2 为什么学习Shell脚本?

Shell脚本将一系列Linux命令按逻辑组织到文件中,实现自动化执行,其核心价值在于:

  • 自动化运维:批量部署服务、添加用户、备份数据等
  • 效率提升:替代重复的手动操作,减少人为错误
  • 系统集成:衔接不同命令和程序,实现复杂业务逻辑

二、Shell脚本基础:从编写到执行

2.1 脚本的基本结构

一个标准的Shell脚本包含三部分:

#!/bin/bash  # 解释器声明,指定脚本由bash执行
# 这是注释内容,用于说明脚本功能
echo "Hello World!"  # 可执行语句,输出字符串

在这里插入图片描述

2.2 脚本执行的四种方式

  1. 当前路径执行(需执行权限):

    chmod +x hello.sh  # 赋予执行权限
    ./hello.sh         # 相对路径执行
    

    在这里插入图片描述

  2. 解释器直接运行(无需执行权限):

    bash hello.sh 或 sh hello.sh
    

    在这里插入图片描述

  3. source命令加载(影响当前Shell环境):

  ./hello.sh或 /opt/hello.sh

在这里插入图片描述

  1. 管道输入执行
    cat hello.sh | bash                                                                                                                                            
    
    在这里插入图片描述
    在这里插入图片描述

三、核心语法:变量、输入输出与运算

3.1 变量:数据存储的基本单元

  • 定义规则:变量名=值(等号两侧无空格),如name="shell"

  • 命名规范:以字母开头,可包含数字和下划线,区分大小写

  • 使用方法:通过$变量名${变量名}调用,如echo $name

  • 在这里插入图片描述

  • 特殊类型

    • 只读变量:readonly pi=3.14(无法修改或删除)
      在这里插入图片描述

3.2 输入输出重定向

Shell默认通过键盘输入、显示器输出,重定向可改变数据流方向:

  • 输出重定向
    • command > file:覆盖写入文件

    • command >> file:追加写入文件

    • command 2> error.log:错误信息写入文件
      用ls 看这个不存在的文件把信息记录在error.log
      在这里插入图片描述
      vim 查看error文件的内容
      在这里插入图片描述

    • command &> all.log:所有输出(包括错误)写入同一文件
      例如:如果脚本里有 echo “备份开始…”(正常输出)和 tar: 无法打开文件(错误输出),两者都会被写入 backup.log。

    # 场景:运行脚本,把所有输出(日志、报错)存到all.log  
    

./backup_script.sh &> backup.log


- **输入重定向**:```bash# 从文件读取输入代替键盘passwd --stdin user < password.txt

例如:

  1. 新建密码文件(内容为 “123456”,仅一行)
    echo “123456” > password.txt

  2. 用 root 给 user 设置密码(非交互)
    sudo passwd --stdin user < password.txt
    在这里插入图片描述

  3. 验证:su - user 后,用 123456 登录

  • 管道操作:通过|将前一个命令的输出作为后一个命令的输入:
    # 查找包含bash的用户并提取用户名
    grep "bash" /etc/passwd | awk -F: '{print $1}'
    

在这里插入图片描述

3.3 运算符与表达式

  • 算术运算

    # 三种常用方式
    echo $((1+2))   # 3
    echo $[3*4]     # 12
    echo `expr 10 / 2`  # 5(注意运算符两侧需空格)
    

    在这里插入图片描述

  • 关系运算:仅支持数字比较

    • -eq(等于)​​Eq​​ual、-ne(不等于)N​​ot ​​E​​qual、-gt(大于)G​​reater ​​T​​han
    • -lt(小于)​​L​​ess ​​T​​han、-ge(大于等于)G​​reater than or ​​E​​qual、-leL​​ess than or ​​E​​qual(小于等于)
  • 字符串运算

    • = (相等)、!=(不等)、-z(空字符串)、-n(非空字符串)

四、流程控制:构建脚本逻辑

4.1 条件判断:if-else语句

#!/bin/bash
score=$1
if [ $score -ge 90 ]; thenecho "优秀"
elif [ $score -ge 80 ]; thenecho "良好"
elif [ $score -ge 60 ]; thenecho "及格"
elseecho "不及格"
fi

在这里插入图片描述

4.2 循环结构:for与while

  • for循环:适合已知循环次数的场景
    # 数值循环
    for ((i=1; i<=5; i++)); doecho "第$i次循环"
    done
    

在这里插入图片描述

  # 列表循环for fruit in apple banana orange; doecho "水果:$fruit"done

在这里插入图片描述

  • while循环:适合未知循环次数的场景
    # 累加1-10的和
    count=0
    num=1
    while ((num <= 10)); docount=$[count + num]let num++  # 自增操作
    done
    echo "总和:$count"
    

在这里插入图片描述

七、学习建议

  1. 熟悉Linux命令:Shell脚本的本质是命令的组合,掌握grepawksed等工具能大幅提升脚本能力
  2. 重视语法细节:注意空格、括号等符号的使用(如[ ]前后需空格)
  3. 多写实战脚本:从简单的文件备份、日志分析开始,逐步实现复杂功能
  4. 善用调试技巧:通过bash -x 脚本名查看脚本执行过程,定位错误

Shell编程是Linux运维的必备技能,掌握它能让你从重复的手动操作中解放出来,实现真正的自动化运维。从今天开始,动手编写你的第一个Shell脚本吧!

http://www.dtcms.com/a/356069.html

相关文章:

  • 网络是怎样连接的,笔记整理
  • C语言知识点补充(链表和队列)
  • 8.变量和数据类型
  • 浏览器访问 ASP.NET Core wwwroot 目录下静态资源的底层实现
  • 多线程 线程池 并发
  • 机器视觉学习-day08-图像缩放
  • MBA/EMBA毕业论文写作总结
  • 第20章|轻松实现远程控制
  • NumPy 2.x 完全指南【三十二】通用函数(ufunc)之数学运算函数
  • 面试tips--JVM(1)--对象分配内存的方式TLAB
  • CTFshow系列——命令执行web61-68
  • C++之多态篇
  • 君正T31学习(四)- MT7682+VLC出图
  • 【python】python进阶——as关键字
  • 程序代码篇---类
  • SpringCloud Alibaba Nacos 注册中心/配置中心
  • SpringBoot 配置文件在运维开发中的应用
  • 基于springboot的商业店铺租赁系统
  • 在 Vue 前端(Vue2/Vue3 通用)载入 JSON 格式的动图
  • 校园文化活动管理系统设计与实现(代码+数据库+LW)
  • web前端知识——第一阶段
  • 【buildroot】【1. Buildroot版本与Linux内核调试对应关系】
  • 基于SpringBoot的旅游景点推荐系统【2026最新】
  • 域名所有权变更,需要重新备案吗
  • Day16_【机器学习分类】
  • 软磁材料与硬磁材料
  • MTK Linux DRM分析(十九)- KMS drm_framebuffer.c
  • LeetCode 141.环形链表
  • 软考中级【网络工程师】第6版教材 第4章 无线通信网 (上)
  • 8.28 JS移动端事件