Linux-Shell编程

news2024/11/15 13:52:43

一,shell编程的概念

在这里插入图片描述

1.0Shell与内核的关系

内核是Linux系统的核心,它是操作系统的最底层部分,负责管理计算机的硬件资源,例如CPU、内存、磁盘等。内核还提供了许多系统调用,供应用程序使用,例如打开文件、读写文件、创建进程、网络通信等等。
由于用户无法直接操作内核,所以需要借助Shell来进行命令的传输:
在这里插入图片描述

Shell是Linux系统中的一个用户界面,它是用户与内核之间的一个接口。Shell提供了一个命令行界面和一个脚本语言,用户可以使用各种命令和脚本来与操作系统交互。Shell解释器接受用户输入的命令,将其解析为系统调用和其他操作,并将它们传递给内核执行。

在Linux中,Shell与内核之间的交互主要通过系统调用来实现。当用户在Shell中输入一个命令时,Shell解释器将命令解析为系统调用和其他操作,并将它们传递给内核执行。当内核执行完命令后,将结果返回给Shell解释器,Shell解释器将结果显示给用户。

另外,Shell还可以通过环境变量来影响内核的行为。例如,PATH环境变量指定了可执行文件的搜索路径;HOME环境变量指定了当前用户的主目录;LD_LIBRARY_PATH环境变量指定了动态链接库的搜索路径等等。这些环境变量可以影响系统调用的执行结果。

总之,Shell和内核是Linux系统中两个非常重要的概念,它们之间的关系非常密切。Shell作为用户与内核之间的接口,负责解析用户输入的命令,并将其转换为系统调用和其他操作,从而影响内核的行为。

1.1Shell与Shell脚本

1.1.1Shell

Shell是一种命令行解释器,用来解释执行用户的命令,它是操作系统内核和用户之间的接口。一般是用户一条条输入,Shell一条条执行,这种方式称为交互式。它接收用户的命令,并将其转化为内核可以理解的指令,同时将内核的输出返回给用户。

1.1.2Shell脚本

Shell还有一种执行命令的方式就是批处理(Batch),用户实现写好一个Shell脚本(Script),里面包含很多条命令,Shell一次性执行完所有命令,不用一条条输入执行。Shell脚本是一种用于自动化任务和管理系统的脚本语言。它们是在Shell中编写的一系列命令和控制结构,以执行特定的任务。Shell脚本可以通过命令行运行,并可以接受用户输入和参数。

因此,Shell是一种交互式的命令行解释器,而Shell脚本是一种脚本语言,用于编写自动化任务和管理系统。Shell脚本通常包含一系列Shell命令和控制结构,可以在Shell中运行。

1.2Shell脚本与编程语言的区别

Shell脚本是一种脚本语言,用于编写自动化任务和管理系统。它们通常用于在Linux和其他Unix系统上编写脚本,以执行诸如文件操作、系统管理、网络编程等任务。

编程语言是一种通用的编程语言,可以用于编写广泛的应用程序。它们可以用于开发Web应用程序、桌面应用程序、移动应用程序、游戏等各种应用程序。

Shell脚本是一种解释性语言,与编译性语言(如C、Java等)不同。解释器读取脚本并将其转换为机器指令,而编译器将源代码转换为机器指令。

Shell脚本通常使用命令行界面(CLI)与用户交互,而编程语言可以使用GUI界面或CLI与用户交互。

Shell脚本通常使用一些基本的控制结构,例如条件语句和循环语句,而编程语言通常提供更丰富的控制结构和数据类型。

总的来说,Shell脚本是一种特定用途的脚本语言,用于自动化系统管理任务,而编程语言则更通用,可用于编写广泛的应用程序。

二,Shell编程基本语法

2.1系统调用fork 和exec介绍

在Shell编程中,fork和exec是两个重要的系统调用,常用于创建新的进程和执行新的程序。

2.1.1fork

fork是一个系统调用,用于创建一个新的进程。调用fork时,操作系统会在当前进程的地址空间中创建一个完全相同的子进程,包括所有变量和指令。子进程是父进程的副本,它从父进程继承了所有的资源和状态,并获得了自己的进程ID。父进程和子进程共享文件描述符,但它们各自拥有独立的地址空间。
fork()函数的语法如下:

pid_t pid = fork();
if (pid == 0) {
  // 子进程
} else if (pid > 0) {
  // 父进程
} else {
  // fork失败
}

2.1.2exec

exec是一个系统调用,用于执行一个新的程序。调用exec时,操作系统会将当前进程的地址空间替换为新的程序的地址空间,并开始执行新程序的指令。exec函数有多个变体(如execl、execv、execle等),它们之间的差异在于参数的传递方式和路径的表示方式等。
exec()函数的语法如下:

int execvp(const char *file, char *const argv[]);

其中,file参数指定要执行的程序的文件名,argv参数是一个包含命令行参数的字符串数组。exec函数将通过file参数指定的程序替换当前进程,并将argv参数传递给新程序。

一般情况下,fork和exec会组合在一起使用,以创建一个新的进程并执行新的程序。

下面是一个示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    pid_t pid = fork();

    if (pid == 0) {
        // 子进程
        char *args[] = {"ls", "-l", NULL};
        execvp(args[0], args);
    } else if (pid > 0) {
        // 父进程
        wait(NULL);
        printf("Child process finished.\n");
    } else {
        // fork失败
        printf("Fork failed.\n");
        return 1;
    }

    return 0;
}

这个示例代码创建一个新进程,然后执行"ls -l"命令。子进程使用execvp函数来执行新程序,而父进程使用wait函数等待子进程的结束,并打印一条消息以指示子进程已经完成。

2.2Linux中外部命令与内建命令

2.2.1外部命令

外部命令是指由可执行文件或脚本文件组成的命令。这些命令通常是独立的可执行文件,可以在终端中使用绝对路径或相对路径来执行它们。Linux系统提供了许多外部命令,例如**ls、grep、**awk、sed等等。这些命令通常是由操作系统提供的,也可以是由第三方软件提供的。通过环境变量 PATH来设这配置,在执行相应的外部命令的时候系统会向PATH中的地址去寻找相关的支持。

2.2.2 内建命令

内建命令是指由Shell解释器本身提供的命令。这些命令不需要单独的可执行文件或脚本文件,它们直接由Shell解释器处理。Linux系统中的常见内建命令包括cd、echo、export、alias、history等等。由于内建命令不需要启动新进程,因此它们通常比外部命令执行得更快。

在执行命令时,Shell优先查找内建命令,如果找到了就直接执行;如果没有找到,则查找可执行文件或脚本文件,如果找到了则执行。如果既没有找到内建命令,也没有找到可执行文件或脚本文件,则Shell会显示一个错误消息。
可以使用type命令来查看一个命令是内建命令还是外部命令。例如:

$ type cd
cd is a shell builtin
$ type ls
ls is aliased to `ls --color=auto'
ls is /bin/ls

这个示例中,type命令显示cd是一个内建命令,而ls是一个外部命令。注意,ls还有一个别名(alias),它指向/bin/ls可执行文件。

2.3Shell编程的基本语法

注释:用 # 开头的行表示注释,注释可以出现在代码任何位置。

变量:使用变量时,变量名不需要使用 $ 符号,赋值时需要使用 = 符号。

输出:使用 echo 命令可以将指定的文本输出到屏幕上。

输入:使用 read 命令可以从用户处获取输入,并将其存储在变量中。

条件语句:使用 if 语句可以根据指定条件执行不同的命令。

循环语句:使用 for 循环和 while 循环可以多次执行相同的命令。

函数:使用函数可以编写可重用的代码块。

  1. 注释
# 这是一条注释
  1. 变量
name="Tom"
  1. 输出
echo "Hello, world!"
  1. 输入
read -p "请输入您的名字:" name
echo "您好,$name!"
  1. 条件语句
if [ $age -gt 18 ]
then
    echo "您已经成年了!"
else
    echo "您还未成年!"
fi
  1. 循环语句
for i in {1..10}
do
    echo $i
done
while [ $count -lt 10 ]
do
    echo $count
    count=$((count+1))
done
  1. 函数
function greet {
    echo "Hello, $1!"
}

greet "Tom"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字员工IN淄博:淄博烧烤火出圈,政务服务很圈粉!

“小饼烤炉加蘸料&#xff0c;灵魂烧烤三件套”&#xff0c;淄博烧烤近期在各大社交媒体平台火爆出圈&#xff0c;不少人慕名前往亲身体验人间烟火气&#xff0c;让这座传统工业城市再度名声鹊起&#xff0c;焕活了淄博文旅市场的发展潜能。淄博人民的淳朴热情造就了这一次淄博…

STM32F401RET6 LQFP64 (Nucleo-F401RE) SPI通信(主从双机SPI通信)

STM32F401RET6 LQFP64 (Nucleo-F401RE) SPI通信&#xff08;主从双机SPI通信&#xff09; 1.1 SPI总线介绍 SPI 通讯使用 3 条总线及片选线&#xff0c;3 条总线分别为 SCK、MOSI、MISO&#xff0c;片选线为NSS(CS) NSS 信号线由高变低 &#xff0c;是 SPI 通讯的起始信号 。…

Redis系列--redis集群

一、redis集群介绍 一、简介与注意事项 由于数据量过大&#xff0c;当单个master挂了再slave进行选举时&#xff0c;会有一定时间内无法进行写操作&#xff0c;会出现数据的丢失。也就数说单个master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水…

AcWing 243. 一个简单的整数问题2

题目描述 题目链接&#xff1a;AcWing 243. 一个简单的整数问题2 给定一个长度为 N 的数列 A&#xff0c;以及 M 条指令&#xff0c;每条指令可能是以下两种之一&#xff1a; C l r d&#xff0c;表示把 A[l],A[l1],…,A[r] 都加上 d。 Q l r&#xff0c;表示询问数列中第 l∼…

【5.20】五、安全测试——安全测试工具

目录 5.4 常见的安全测试工具 1. Web漏洞扫描工具——AppScan 2. 端口扫描工具——Nmap 3. 抓包工具——Fiddler 4. Web渗透测试工具——Metasploit 小提示&#xff1a;Kali Linux 5.4 常见的安全测试工具 安全测试是一个非常复杂的过程&#xff0c;测试所使用到的工具也…

自学网络安全/Web安全,一般人我还是劝你算了吧

由于我之前写了不少网络安全技术相关的文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f; 要学哪些东西&#xff1f; 有哪些方向&#xff1f; 怎么选&a…

【leetcode】1373. 二叉搜索子树的最大键值和

二叉搜索子树的最大键值和 问题描述问题简单分析提交之旅第一次提交-失败第二次提交-失败第三次提交-成功 问题描述 二叉搜索子树的最大键值和 给你一棵以 root 为根的 二叉树 &#xff0c;请你返回 任意 二叉搜索子树的最大键值和。 二叉搜索树的定义如下&#xff1a; 任意节…

JVM学习(六)

1. JAVA 集合 1.1. 接口继承关系和实现 集合类存放于 Java.util 包中&#xff0c;主要有 3 种&#xff1a;set(集&#xff09;、list(列表包含 Queue&#xff09;和 map(映射)。 1. Collection&#xff1a;Collection 是集合 List、Set、Queue 的最基本的接口。 2. Iterato…

Apple Safari 16.5 发布- macOS 专属浏览器 (独立安装包下载)

Apple Safari 16.5 - macOS 专属浏览器 (独立安装包下载) Safari 浏览器 16 for macOS Montery, Big Sur 请访问原文链接&#xff1a;https://sysin.org/blog/apple-safari-16/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org…

DevOps系列文章-Kubernetes实现CI与CD配置

Kubernetes实现CI与CD配置 一、基本介绍 基于 Kubernetes 实现 CI/CD 配置&#xff0c;其实和往常那些 CI/CD 配置并没有太大区别。都是通过 提交代码&#xff0c;拉取代码&#xff0c;构建代码&#xff0c;发布代码来实现的。 只不过要是通过 K8s 来实现的话&#xff0c;则是…

HNU-计算机系统-讨论课7

选题三 、我们自己来写&#xff0c;太“库”啦 ~ &#xff08; 1 &#xff09; 在 Linux 里用 C 语言进行代码设计&#xff0c;能对某一个班级、某一门 课程、某一名学生的分数进行分析&#xff0c;比如分数段、最高分、最低 分、排名、优势课程等&#xff0c;具体涉及分析…

【计算机系统基础bomb lab】CSAPP实验:Bomb Lab

CSAPP 实验&#xff1a;Bomb Lab 实验内容简述 作为实验目标的二进制炸弹 “Bomb Lab” Linux可执行程序包含了多个阶段(或关卡)&#xff0c;在每个阶段程序要求输入一-个特定字符串&#xff0c;如果输入满足程序代码所定义的要求&#xff0c;该阶段的炸弹就被拆除了&#xf…

基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(二)硬件设计

3.1 引言 采集卡的硬件设计是实现采集功能的基础&#xff0c;良好的硬件设计可以使采集功能更容 易实现&#xff0c;方便软件开发。本章基于第二章的硬件设计方案来详细介绍采集卡硬件设计。 包括载卡和子卡的芯片的选型、配置和具体电路的设计。载卡和子卡的硬件设计总体 …

美联储内部分歧不断加大 妥协方案:6月“跳过”,7月再加

在周五举行的托马斯劳巴赫研究会议上&#xff0c;美联储主席鲍威尔、前主席伯南克一同出席&#xff0c;并对当前的热点政策问题发表了看法。货币政策&#xff0c;自然是备受关注的议题。 凭借研究“银行和金融危机”荣获2022年诺贝尔经济学奖的伯南克表示&#xff0c;银行业危机…

Linux文件与目录管理笔记1

鸟哥私房菜笔记 这里写目录标题 常用文件命令cd,pwd,mkdir,rmdir 执行文件的路径的变量:$PATHls,cp,rm,mv 文件内容查看指令(cat,tac,nl)可翻页查看(more,less)More(一页一页翻动)less 数据截取&#xff08;head,tail&#xff09;非纯文本文件&#xff1a;od 常用文件命令 cd…

lwIP:宏 LWIP_TCPIP_CORE_LOCKING(内核锁定)

从 lwIP-2.0.0 开始&#xff0c;在 opt.h 中多了一个宏开关 LWIP_TCPIP_CORE_LOCKING&#xff0c;默认使能。这个宏是启用内核锁定功能的。 本文探索这个宏的前世今生。 2007 年 5 月 24 日&#xff0c;Simon Goldschmid &#xff08;以下简称 西蒙 &#xff09;提交了一个任务…

DriveAct:用于自动驾驶汽车细粒度驾驶员行为识别的多模态数据集

Drive&Act&#xff1a;A Multi-modal Dataset for Fine-grained Driver Behavior Recognition in Autonomous Vehicles 摘要1. 简介2. 其它驾驶员动作数据集3. Drive&Act数据集3.1 数据采集3.2 记录的数据流传感器设置和视频流3D Body Pose3D Head PoseInterior ModelA…

接口优化技巧汇总

1.批处理 批量思想&#xff1a;批量操作数据库&#xff0c;这个很好理解&#xff0c;我们在循环插入场景的接口中&#xff0c;可以在批处理执行完成后一次性插入或更新数据库&#xff0c;避免多次IO。 //批量入库 batchInsert();2.异步处理 异步思想&#xff1a;针对耗时比较…

短视频去水印接口 支持各短视频平台去水印 快速稳定

短视频去水印接口 支持各短视频平台去水印&#xff0c;抖音、快手、微视、西瓜等。 快速稳定 不限次 免费测试 接口开发文档 返回格式&#xff1a; JSON 请求方式&#xff1a; GET/POST 请求示例&#xff1a; 请求参数说明&#xff1a; 字段必填类型说明url是String短视…

听说你想成为一名6的飞起的黑客,这些资料怎么能少

重点提醒&#xff1a;本项目工具来源于互联网&#xff0c;是否含带木马及后门请自行甄别&#xff01;&#xff01;Hvv来即&#xff0c;请大家提高警惕&#xff01;&#xff01;&#xff01; 受限于篇幅原因&#xff0c;无法全部展示&#xff0c;如果你需要的话&#xff0c;可以…