linux-Shell 编程-Shell 脚本基础
Linux Shell 编程:Shell 脚本基础
在Linux系统中,Shell脚本是一种强大的自动化工具。通过编写Shell脚本,用户可以自动化重复性任务、系统管理操作和程序控制流程,极大提高工作效率。
1. 什么是Shell脚本?
Shell脚本是由一系列Linux命令组成的文本文件,通常用于自动化完成任务。Shell脚本可以在终端中运行,而无需逐个输入命令。Shell脚本的扩展名通常为.sh,但这不是强制性的。
1.1 Shell类型
常见的Shell有多种,其中最常用的包括:
- Bash(Bourne Again Shell):Linux系统中最常用的Shell,功能强大且兼容性好。
- Sh(Bourne Shell):Bash的前身,较为简洁。
- Zsh(Z Shell):功能更丰富的Shell,但与Bash有些不兼容。
本文主要基于Bash进行讲解。
1.2 Shell脚本的基本结构
一个简单的Shell脚本示例如下:
#!/bin/bash
# 这是一个简单的Shell脚本示例
echo "Hello, World!"
#!/bin/bash:这行称为Shebang,告诉系统使用哪个解释器(如/bin/bash)来执行脚本。#:注释符号,后面的内容会被Shell忽略。
1.3 创建和运行Shell脚本
-
创建一个脚本文件,例如
script.sh:nano script.sh -
在文件中输入脚本内容:
#!/bin/bash echo "Hello, Linux!" -
保存并退出文件后,给予执行权限:
chmod +x script.sh -
运行脚本:
./script.sh
输出将是:
Hello, Linux!
2. Shell 脚本中的变量
2.1 变量的定义与使用
在Shell脚本中,变量的使用是非常灵活的。变量名必须以字母或下划线开头,不能以数字开头。赋值和引用变量的基本格式如下:
-
定义变量
name="Alice" -
引用变量
在引用变量时,需要在变量名前加上$符号:echo "Hello, $name"
2.2 变量的作用域
- 全局变量:可以在脚本中的任何地方使用,通常是通过直接定义的变量。
- 局部变量:可以使用
local关键字定义,通常用于函数内,生命周期仅限于函数执行期间。
2.3 环境变量
环境变量是Shell脚本中预定义的全局变量,例如:
$HOME:当前用户的主目录。$USER:当前登录的用户名。$PATH:存储可执行文件的搜索路径。
可以使用echo命令查看环境变量的值:
echo $HOME
echo $USER
echo $PATH
2.4 命令替换
Shell脚本中可以通过命令替换来将命令的输出赋值给变量。两种常用的命令替换方式:
-
使用反引号
`command`:result=`date` -
使用
$()语法:result=$(date)
3. Shell 脚本中的控制结构
控制结构用于控制脚本的执行流程,包括条件语句和循环。
3.1 条件语句
Shell脚本中常用的条件语句包括if-else结构和case语句。
-
if-else 语句:
#!/bin/bash num=10 if [ $num -gt 5 ]; thenecho "num大于5" elseecho "num小于或等于5" fi条件判断需要使用
[和],注意必须在[和条件之间留有空格。 -
if-elif-else 语句:
#!/bin/bash num=8 if [ $num -gt 10 ]; thenecho "num大于10" elif [ $num -eq 8 ]; thenecho "num等于8" elseecho "num小于8" fi -
case 语句:
case结构用于匹配多个模式:#!/bin/bash animal="cat" case $animal in"cat")echo "这是只猫";;"dog")echo "这是只狗";;*)echo "未知动物";; esac
3.2 循环
Shell脚本支持多种循环结构。
-
for 循环:
用于遍历一组数据:for i in 1 2 3 4 5; doecho "数字: $i" done -
while 循环:
根据条件循环执行命令:count=1 while [ $count -le 5 ]; doecho "计数: $count"count=$((count + 1)) done -
until 循环:
until循环与while相反,直到条件为真时才会停止:count=1 until [ $count -gt 5 ]; doecho "计数: $count"count=$((count + 1)) done
4. 常见的Shell脚本命令
4.1 文件和目录操作
-
创建目录:
mkdir new_directory -
删除文件或目录:
rm filename rmdir directory_name -
移动或重命名文件:
mv old_filename new_filename -
复制文件:
cp source_file destination_file
4.2 文本操作
-
查看文件内容:
cat filename -
查找文本:
使用grep命令查找文件中包含特定模式的行:grep "pattern" filename -
文件内容重定向:
将命令输出重定向到文件:echo "Hello" > output.txt # 覆盖文件 echo "World" >> output.txt # 追加到文件末尾
4.3 管道和重定向
-
管道(
|):
将一个命令的输出作为另一个命令的输入:ls | grep ".txt" -
标准输出与错误输出重定向:
command > output.txt 2> error.txt # 分别将标准输出和错误输出重定向到不同的文件 command &> all_output.txt # 将所有输出重定向到同一个文件
5. Shell 脚本中的函数
Shell脚本中可以定义函数,用于复用代码块,提高脚本的可读性和维护性。
5.1 定义函数
定义函数的基本语法如下:
function_name() {# 函数体echo "Hello from function"
}
5.2 调用函数
函数定义后,可以通过函数名直接调用:
#!/bin/bash
greet() {echo "Hello, $1!"
}greet "Alice"
输出为:
Hello, Alice!
在这个示例中,$1表示传递给函数的第一个参数,类似地,$2表示第二个参数。
6. Shell脚本调试
在编写Shell脚本时,难免会遇到错误。通过以下方式可以方便地调试脚本:
-
使用
-x选项运行脚本:
-x选项会在脚本执行时打印每一行命令及其结果,帮助排查问题:bash -x script.sh -
在脚本中启用调试模式:
可以在脚本中加入set -x来启用调试模式,set +x来关闭调试模式:set -x # 调
试代码
set +x
---### 7. 实用脚本示例以下是一个用于备份目录的简单脚本:```bash
#!/bin/bashbackup_dir="/home/user/data"
backup_dest="/home/user/backup"# 检查目标目录是否存在
if [ ! -d $backup_dest ]; then
mkdir -p $backup_dest
fi# 创建备份文件
tar -czf $backup_dest/backup_$(date +%Y%m%d).tar.gz $backup_direcho "备份完成!"
这个脚本会将/home/user/data目录打包为tar.gz文件,并保存在/home/user/backup目录下,文件名包含日期。
总结
Shell脚本是Linux系统管理中不可或缺的工具。通过Shell编程,用户可以自动化处理系统任务、文件操作、网络操作等一系列功能。本文介绍了Shell脚本的基础知识,包括变量、控制结构、常见命令、函数和调试技术,掌握这些基础后,用户可以编写更复杂的脚本来提高工作效率。
相关文章:
linux-Shell 编程-Shell 脚本基础
Linux Shell 编程:Shell 脚本基础 在Linux系统中,Shell脚本是一种强大的自动化工具。通过编写Shell脚本,用户可以自动化重复性任务、系统管理操作和程序控制流程,极大提高工作效率。 1. 什么是Shell脚本? Shell脚本是…...
Linux运维篇-tigervnc工具的使用
目录 简介下载使用clientserver配置文件服务管理 设定密码(先切换成对应的用户):配置多用户的VNC tigervnc连接排错一、vnc密码错误二、vncserver端口忘记了三、连接很卡,或者画面没有反应四、服务报错 简介 TigerVNC是VNC的一种…...
基于Spark的电影推荐系统设计与实现(论文+源码)_kaic
摘 要 在云计算、物联网等技术的带动下,我国已步入大数据时代。电影是人们日常生活中重要的一种娱乐方式,身处大数据时代,各种类型、题材的电影层出不穷,面对琳琅满目的影片,人们常感到眼花缭乱。因此,如…...
基于python+django+vue的医院预约挂号系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…...
镀金引线---
一、沉金和镀金 沉金和镀金都是常见的PCB金手指处理方式,它们各有优劣势,选择哪种方式取决于具体的应用需求和预算。 沉金(ENIG)是一种常用的金手指处理方式,它通过在金手指表面沉积一层金层来提高接触性能和耐腐蚀性…...
『功能项目』窗口可拖拽脚本【59】
本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目, 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本:DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…...
Map--08--CurrentHashMap 与 Hashtable的异同?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Map方法computeIfAbsent1.computeIfAbsent 方法的简介2.案例computeIfAbsent() Map方法computeIfAbsent computeIfAbsent方法是Java 8中引入的一种简化操作Map的方…...
Docker学习笔记(三)存储与卷
挂载机制介绍 我们都知道,默认下,Docker容器与宿主机是完全隔离的,这种特性使得我们创建与删除容器都变得更方便,不需要再去删除宿主机上容器遗留下来的痕迹。 但是,当我们使用数据库一类需要持久化数据、共享数据…...
硬件工程师笔试面试——滤波器
目录 12、滤波器 12.1 基础 滤波器原理图 滤波器实物图 12.1.1 概念 12.1.2 滤波器的分类 12.1.3 滤波器的工作原理 12.1.4 滤波器的应用 12.1.5 滤波器设计的关键参数 12.2 相关问题 12.2.1 不同类型的滤波器在实际应用中的具体作用是什么? 12.2.2 如何设计一个简…...
【SpringBoot3】面向切面 AspectJ AOP 使用详解
文章目录 一、AspectJ介绍二、简单使用步骤1、引入依赖2、定义一个Aspect3、开启AOP支持 三、AOP 核心概念四、切点(Pointcut)1. execution2. within3. this & target4. args & args5. within & target & annotation 五、通知࿰…...
wav怎么转mp3格式?给你推荐几种音频格式转换方法
wav怎么转mp3格式?将wav文件转换为MP3格式是一个常见的操作,尤其适用于需要节省存储空间或确保文件兼容性的场景。wav文件保存了音频的所有原始数据,这使得它们的文件体积往往非常庞大。相比之下,MP3格式通过有损压缩技术显著减小…...
Redis的AOF持久化、重写机制、RDB持久化、混合持久化
1、AOF持久化 1.1.AOF持久化大致过程 概括:命令追加(append)、文件写入、文件同步(sync) Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候&#…...
Dom4j使用xpath查询xml文
Dom4j使用xpath查询带有命名空间的xml文件 方式1 忽略命名空间 DocumentFactory factory DocumentFactory.getInstance(); SAXReader reader new SAXReader(factory); Document document reader.read(xmlFilePath); Element rootElement document.getRootElement(); Nod…...
国家专精特新小巨人企业指标解析与扶持领域
一、什么是国家专精特新小巨人 (一)概念与定义 专精特新“小巨人”企业是指那些在细分市场中具有专业化、精细化、特色化和新颖化特征的中小企业中的佼佼者。这些企业在创新能力强、市场占有率高、掌握关键核心技术以及质量效益方面表现突出࿰…...
进程的属性
tips: task_struct就是linux下的PCB 操作系统不相信任何外部用户,而是只提供窗口,不可能直接与用户打交道,而是通过操作系统 tast_struct用来描述所有进程,用来管理 ; 和 && 可以同时跑两个命令 进…...
Git 中的refs
在 Git 中,refs 是用来存储 Git 对象(如提交、树、标签等)的引用。每个 ref 都是一个指针,指向一个特定的 Git 对象。以下是 Git 中几种常见的 refs 及其含义: 1. refs/heads/ 表示:本地分支。 用途&…...
408算法题leetcode--第六天
58. 最后一个单词的长度 58. 最后一个单词的长度思路:反向遍历时间:O(n);空间:O(1) class Solution { public:int lengthOfLastWord(string s) {int id s.size() - 1;while(s[id] ){--id;}int ret 0;while(id > 0 &&…...
ubuntu64位系统无法运行32位程序的解决办法
在 64 位的 Ubuntu 系统上运行 32 位程序时,如果出现问题,可能是由于缺少 32 位库支持。以下步骤可以帮助你解决这一问题: 1. 启用 32 位架构 首先,确保系统支持 32 位架构。你可以通过以下命令添加 32 位架构支持: …...
深入理解Go语言中的并发封闭与for-select循环模式
在现代编程中,并发已经成为提高程序性能和响应能力的关键手段。然而,在并发环境下,如何安全地访问和操作共享数据却是一大挑战。本文将深入探讨Go语言中的**封闭(confinement)**技术,以及常见的for-select循环模式,帮助您编写更高效、更安全的并发代码。 并发编程中的安…...
Java学习Day42:骑龙救!(springMVC)
springMVC与sevlet都是对应表现层web的,但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标: 小案例: 1.导入依赖 spring-context: 提供 Spring 框架的核心功能,如依赖注入、事件发布和其他应用上…...
OpCore-Simplify终极指南:如何快速构建完美的OpenCore EFI配置
OpCore-Simplify终极指南:如何快速构建完美的OpenCore EFI配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的Hackintosh配置…...
智慧医院的“新基建”:从顶层设计到全栈式智能运维的深度解构(PPT)
“未来的医院,其核心竞争力将不再仅仅是顶尖的医生和昂贵的设备,而是由数据驱动、以患者为中心、能自我优化的智慧生命体。”在“健康中国2030”与“数字中国”两大国家战略交汇的时代背景下,医疗健康产业正经历一场前所未有的数字化重构。传…...
3步破解音乐平台碎片化困局:Listen1多源聚合技术深度实践
3步破解音乐平台碎片化困局:Listen1多源聚合技术深度实践 【免费下载链接】listen1_chrome_extension one for all free music in china (chrome extension, also works for firefox) 项目地址: https://gitcode.com/gh_mirrors/li/listen1_chrome_extension …...
软件测试的V模型竟然是有争议的?——软件测评师题目拆解
不知道有多少同学在这个简单的题目栽过跟头,国内、国外对于V模型的定义是有出入的(习题在文末十二五规划教材《软件测试(第2版)佟伟光 主编》 一书中给出的V模型QT官方对应V模型的定义是这样的等级考试用书《软件测评师教程》第二…...
提升arduino开发效率:用快马平台一键生成常用工具模块代码
作为一名经常折腾Arduino的开发者,我发现在项目开发中,总有些重复性的代码需要反复编写。最近尝试用InsCode(快马)平台来生成这些常用工具模块,效率提升非常明显。今天就把我的实践心得分享给大家。 I2C设备扫描功能 在连接多个I2C设备时&…...
利用Timeshift在Linux系统中实现高效系统快照与灾难恢复
1. 为什么你需要Timeshift来保护你的Linux系统 作为一个用了十几年Linux的老用户,我见过太多因为系统崩溃而抓狂的场景。记得有一次在更新内核时突然断电,结果系统直接罢工,那天我花了整整8小时才把环境重新配置好。如果你也遇到过类似情况&a…...
终极指南:如何让AMD和Intel显卡也能享受DLSS级别的AI超分辨率技术
终极指南:如何让AMD和Intel显卡也能享受DLSS级别的AI超分辨率技术 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler Opti…...
统计学顶刊投稿攻略:从JASA到Biometrika的写作风格差异详解
统计学顶刊投稿攻略:从JASA到Biometrika的写作风格差异详解 在统计学研究的星辰大海中,四大顶级期刊犹如指引方向的灯塔。JASA、JRSSB、Annals of Statistics和Biometrika各自拥有独特的学术气质和审稿偏好,理解这些差异往往决定着投稿的成败…...
Linux 0.11内核调试实战:手把手教你用Bochs+GDB定位第一次页故障(附完整答案)
Linux 0.11内核调试实战:从页故障到内存管理的深度探索 当你第一次在Linux 0.11内核实验中遇到页故障时,那种既兴奋又困惑的感觉可能还记忆犹新。作为操作系统学习者,理解页故障不仅是掌握内存管理的关键,更是通往内核深处的一扇门…...
STM32CubeIDE实战:HAL库串口中断接收的5个常见坑点及解决方案
STM32CubeIDE实战:HAL库串口中断接收的5个常见坑点及解决方案 在工业传感器数据采集、设备间通信等场景中,稳定可靠的串口通信往往是嵌入式开发的关键环节。许多开发者在使用STM32CubeIDE配合HAL库实现串口中断接收时,虽然能够快速搭建基础功…...
