《Linux基础》09. Shell 编程

news2024/11/18 6:18:39

Shell 编程

  • 1:Shell 简介
  • 2:Shell 脚本
    • 2.1:规则与语法
    • 2.2:执行方式
    • 2.3:第一个 Shell 脚本
  • 3:变量
    • 3.1:系统变量
    • 3.2:用户自定义变量
      • 3.2.1:规则
      • 3.2.2:基本语法
      • 3.2.3:示例
    • 3.3:自定义环境变量
  • 4:位置参数变量
    • 4.1:语法
    • 4.2:示例
  • 5:预定义变量
    • 5.1:语法
    • 5.2:示例
  • 6:读取标准输入
  • 7:运算符
  • 8:条件判断
    • 8.1:基本判断
    • 8.2:文件权限判断
    • 8.3:文件类型判断
    • 8.4:多条件判断
    • 8.5:示例
  • 9:流程控制
    • 9.1:if 判断
    • 9.2:case 判断
    • 9.3:for 循环
      • 9.3.1:语法
      • 9.3.2:示例
    • 9.4:while 循环
    • 9.5:until 循环
  • 10:函数
    • 10.1:自定义函数
      • 10.1.1:介绍
      • 10.1.2:示例
    • 10.2:系统函数
  • 11:文件包含


本文以 CentOS7.6 为例。

1:Shell 简介

Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来执行命令,它接收应用程序或用户的命令,然后调用操作系统内核执行。

在这里插入图片描述

2:Shell 脚本

shell 脚本 本质是一个文件,保存特定格式的指令。

只需使用任意文本编辑器,按照语法编写相应程序,即可在安装 shell 命令解释器的环境下执行。

2.1:规则与语法

  • 脚本开头添加以下语句:
#!/bin/bash

“ #! ” 用来声明脚本由什么 shell 解释,否则使用默认 shell

  • 单个 “ # ” 号代表注释当前行。
# 这是注释
  • 多行注释的写法:
:<<!
这也是注释
!
  • 脚本文件一般以 “ .sh ” 为后缀名。
  • 不要轻易加空格。
  • 单引号与双引号的作用略有区别。
  • 使用反引号【`】引用命令,则可以运行里面的命令并把结果返回。
  • 【$】符号的使用,可与反引号【`】效果相同。

2.2:执行方式

执行 shell 脚本有三种方式:

  • 方式一

直接输入脚本的相对路径或绝对路径。(需授予脚本文件可执行权限 “ +x ”)

  • 方式二

shbash 命令加上脚本相对路径或绝对路径。(脚本文件不需要可执行权限)

  • 方式三

.source 命令加上脚本相对路径或绝对路径。(脚本文件不需要可执行权限)

第三种方式不同于前两种,前两种方式运行时会嵌套子shell;第三种方式不会嵌套,就在本环境运行。

嵌套子shell与不嵌套子shell的区别:环境变量的继承关系。如在子shell中设置的当前变量,父shell中是不可见的。

2.3:第一个 Shell 脚本

创建一个脚本,输出 “ hello world! ”。

#!/bin/bash

# filename: hello.sh

echo "Hello World!"

3:变量

Linux 中 Shell 变量有系统变量用户自定义变量

除此以外还有位置参数变量预定义变量。在后面会介绍。

3.1:系统变量

系统变量也可以叫做环境变量。一般是指在操作系统中用来指定操作系统运行环境的一些参数。

环境变量有:

$HOME$PWD$SHELL$USER 等等

查看某个系统变量
echo $HOME

显示所有系统变量
set

3.2:用户自定义变量

3.2.1:规则

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
  • 等号两侧不能有空格。
  • 变量名称一般习惯为大写,这是一个规范,遵守即可。
  • 使用变量时要加上 “ $ ”。

3.2.2:基本语法

定义变量

变量名=

撤销变量:(即销毁某个变量)

unset 变量名

静态变量声明

readonly 变量名=

静态变量不能撤销,为只读。

3.2.3:示例

示例脚本如下:

#!/bin/bash

# filename: var.sh

# 定义变量 A
A=100

# 输出变量 A
echo A=$A
echo "A=$A"    # 双引号输出为:A=100
echo 'A=$A'    # 单引号输出为:A=$A

# 撤销变量 A
unset A

echo "A=$A"    # 撤销后输出为:A=

# 声明静态变量 B=2
readonly B=2

echo "B=$B"

# 以当前时间为值赋给变量 A 和 C
A=`date`
C=$(date)

echo "A=$A"
echo "C=$C"

3.3:自定义环境变量

用户可以在 /etc/profile 文件中自定义环境变量,以方便不同的脚本使用同一个变量。

方法,在 /etc/profile 添加以下语句:

# 自定义一个变量
export 变量名=

保存后在命令行执行以下命令使定义生效:
source /etc/profile

不要轻易修改系统默认环境变量,以免出错。

示例,自定义 TOMCAT_HOME 环境变量,值为 opt/tomcat:

# 使用 vi 编辑器编辑 /etc/profile 文件
vim /etc/profile

# 添加以下语句
export TOMCAT_HOME=opt/tomcat

# 使生效
source /etc/profile

# 查看定义的环境变量
echo $TOMCAT_HOME

4:位置参数变量

如果想在执行 shell 脚本时传入参数,可以在执行脚本时直接在后面跟上数据,以空格分割,使用位置参数变量来接收。

4.1:语法

===========================================================================
语法     |    说明
---------------------------------------------------------------------------
$n      |    n 为数字,$0 代表命令本身,$1 ~ $9 代表第一到第九个参数,
        |    十以上的参数需要用大括号包含,如 ${10}
---------------------------------------------------------------------------
$#      |    代表命令行中所有参数的个数。
---------------------------------------------------------------------------
$*      |    代表命令行中所有的参数,$* 把所有的参数看成一个整体。
---------------------------------------------------------------------------
$@      |    代表命令行中所有的参数,$@ 把每个参数区分对待。
===========================================================================

4.2:示例

编写以下脚本,并在执行时传参。

#!/bin/bash

# filename: position.sh

echo '$0' = $0
echo '$1' = $1
echo '$2' = $2
echo '$3' = $3
echo '$*' = $*
echo '$@' = $@
echo '$#' = $#

执行以下命令:

bash position.sh 250 hello

结果:

在这里插入图片描述

如果要在脚本执行时读取控制台输入,可以使用 read。

5:预定义变量

shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用。

5.1:语法

===========================================================================
语法     |    说明
---------------------------------------------------------------------------
$$      |    当前进程的进程号(PID)。
---------------------------------------------------------------------------
$!      |    后台运行的最后一个进程的进程号(PID)。
---------------------------------------------------------------------------
$?      |    最后一次执行的命令的返回状态。
        |    如果这个变量的值为 0,说明上一个命令正确执行;
        |    如果这个变量的值不为 0,说明上一个命令执行错误。
===========================================================================

5.2:示例

编写以下脚本,该脚本会调用 4.2:示例 中的脚本。

#!/bin/bash

# filename: preVar.sh

echo "当前执行的进程 id = $$" 
echo '即$$' = $$

#以后台的方式运行 position.sh 脚本,并获取他的进程号。“ & ” 代表后台运行
bash position.sh 233 &

echo "最后一个后台方式运行的进程 id = $!" 
echo '即$!' = $!

echo "执行的结果是:$?"
echo '即$?' = $?

结果:

在这里插入图片描述

6:读取标准输入

读取标准输入,即读取控制台输入。可使用 read。

基本语法

read 可选选项 变量

常用选项

参数说明
-p指定读取值时的提示字符串。
-t指定读取值时等待的时间(秒)。

示例:

#!/bin/bash

# filename: preVar.sh

# 案例 1:读取控制台输入一个 NUM1 值
read -p "请输入一个数 NUM1=" NUM1

echo "你输入的 NUM1 = $NUM1" 

# 案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。
read -t 10 -p "请输入一个数 NUM2=" NUM2

echo "你输入的 NUM2 = $NUM2"

7:运算符

shell 中提供三种方式进行各种运算操作。

  • 方式一
$((运算式))
  • 方式二
$[运算式]
  • 方式三
expr 运算式
方式三(expression)使用注意事项:
运算符间要有空格
如果希望将 expr 的结果赋给某个变量,使用反引号【`】
乘法运算为 \*

示例脚本:

#!/bin/bash

# filename: operate.sh

#案例1:计算 ( 2 + 3 ) * 4 的值
RES1=$(((2+3)*4))
echo "res1 = $RES1"
echo ''

RES2=$[(2+3)*4]
echo "res2 = $RES2"
echo ''

TEMP=`expr 2 + 3` 
RES4=`expr $TEMP \* 4` 
echo "temp = $TEMP"
echo "res4 = $RES4"

结果:

在这里插入图片描述

8:条件判断

Shell 编程中判断条件真伪。

基本语法

[ 条件 ]

# 注意条件前后要有空格。
# 如果条件不包含判断,只是单纯字符串等,则返回 true
# 条件为空则为 false(此时方括号中也要有空格,否则报错)

8.1:基本判断

数值或字符串之间的判断。注意正确使用空格。

语法判断说明
-eq两数比较,相等(equal)
-ne两数比较,不相等(not equal)
-gt两数比较,大于(greater than)
-lt两数比较,小于(less than)
-ge两数比较,大于等于(greater equal)
-le两数比较,小于等于(less equal)
=两字符串比较,相等
!=两字符串比较,不相等

8.2:文件权限判断

对文件权限的判断。使用绝对路径或相对路径来标明文件。

语法判断说明
-r文件判断,有可读权限(read)
-w文件判断,有可写权限(write)
-x文件判断,有可执行权限(execute)

8.3:文件类型判断

对文件类型的判断。使用绝对路径或相对路径来标明文件。

语法判断说明
-e文件存在(existence)
-f文件存在且是一个常规文件(file)
-d文件存在且是一个目录(directory)

8.4:多条件判断

多重条件判断

语法判断说明
-a两个条件同时成立。
-o两个条件只需成立一个。

命令控制执行

=========================================
语法    |    判断说明 
-----------------------------------------
&&     |    左边命令执行成功才会执行右边命令。
-----------------------------------------
||     |    左边命令执行失败才会执行右边命令。
=========================================

8.5:示例

该示例中会用到简单的 if 流程控制语句。在之后介绍。

#!/bin/bash

# filename: condition.sh

# 案例 1:"ok" 是否等于 "ok"
if [ "ok" = "ok" ]
then
	echo "等于"
fi

# 案例 2:23 是否大于等于 22
if [ 23 -ge 22 ]
then
	echo "大于等于"
fi

# 案例 3:/root/shcode/ 目录中的 aaa.txt 文件是否存在
if [ -f /root/shcode/aaa.txt ]
then
	echo "存在"
fi

# 案例 4
if [ hello ]
then
	echo "hello world!"
fi

# 案例 5
if [ 23 -ge 22 -a 23 -lt 50 ]
then
	echo "23大于等于22 且 23小于50"
fi

# 案例 6
[ 15 -le 20 ] && echo "15<=20" || echo "15>20"

运行结果:

在这里插入图片描述

9:流程控制

流程控制语句主要有:

  • if
  • case
  • for
  • while
  • until
  • break
  • continue

shell 脚本 break 与 continue 的使用与高级编程语言类似,这里就不详细介绍了。

9.1:if 判断

  • 单分支判断
if [ 条件 ]
then
	代码
fi

也可以用以下写法:(【;】表示一行实现2步命令的分割)

if [ 条件 ];then
	代码
fi
  • 多分支判断
if [ 条件 ]
then
	代码
elif [ 条件 ]
then
	代码
else
	代码
fi

elif 语句可随意增减

示例:

#!/bin/bash

# filename: ifDemo.sh

if [ $1 -ge 90 ];then
	echo "秀"
elif [ $1 -ge 80 ];then
	echo "优秀"
elif [ $1 -ge 60 ];then
	echo "加油"
else
	echo "不及格"
fi

9.2:case 判断

语法:

case 变量 in
	值1)
		变量满足值1,执行此程序段
		;;
	值2)
		变量满足值2,执行此程序段
		;;
	*)
		都不满足,执行此程序段
		;;
esac

可随意添加分支。;; 相当于 break 。 *) 相当于 default 。

示例:

#!/bin/bash

# filename: caseDemo.sh

read -p "请输入 yes 或 no:" CHOICE

case $CHOICE in
	y* | Y*)
		echo "输入了 yes"
		;;
	n* | N*)
		echo "输入了 no"
		;;
	*)
		echo "输入个啥啊"
		;;
esac

9.3:for 循环

for 循环有两种使用方式。

9.3.1:语法

  • 方式一
for (( 初始变量; 循环控制条件; 变量变化 ))
do
	代码
done
  • 方式二
for 变量 in 值1 值2 值3
do
	代码
done

9.3.2:示例

#!/bin/bash

# filename: forDemo.sh

# 方式一求 1 到 100 的和
SUM=0

for (( i=0; i<=100; i++ ))
do
	SUM=$[$SUM+$i]
done

echo "sum = $SUM"

# 方式二示例
echo ""

for fruit in apple pear banana
do
	echo "$fruit"
done

# 使用命令行输入参数。(这个例子可看出 $* 与 $@ 的区别)
echo ""

for i in "$*"    # 如果不加引号,其实也可遍历
do
	echo "data = $i"
done

echo "============================="

for i in "$@"
do
	echo "data = $i"
done

执行结果:

bash forDemo.sh 1 2 3 4

在这里插入图片描述

9.4:while 循环

当条件成立时进入循环,直到条件不成立时才退出循环。

语法

while [ 条件判断式 ]
do
	代码段
done

示例:

#!/bin/bash

# filename: whileDemo.sh

SUM=0
i=0

while [ $i -le 100 ]
do
	SUM=$[$SUM+$i]
	i=$[$i+1]
done

echo "sum = $SUM"

9.5:until 循环

until 与 while 相反,当条件成立时退出循环。

语法

until [ 条件判断式 ]
do
	代码段
done

10:函数

shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。

函数调用有两种方式:

  • 方式一
$(函数名 参数1 参数2)
  • 方式二
函数名 参数1 参数2

10.1:自定义函数

10.1.1:介绍

函数定义有两种格式。

# 格式一
函数名() {
	代码段
}

# 格式二
function 函数名() {
	代码段
}

函数规则

  • 调用函数之前必须先定义函数。建议将函数放在代码前面。
  • 函数中接收传入的参数可使用位置参数变量。使用规则相似。
  • 函数返回值,可通过 $? 系统变量获得,也可赋给某个变量。
  • 可以加 return 提前结束并带回返回值,范围 0~255。一般规则如下:
    • return :用最后命令的执行状态决定返回值
    • return 0 :无错误返回
    • return 1 :有错误返回
  • 如果不加 return,将以最后一条命令运行结果作为返回值

10.1.2:示例

#!/bin/bash

# filename: addDemo.sh

function add() {
	S=$[$1+$2]
	echo $S
}

read -p "请输入第一个数:" A
read -p "请输入第二个数:" B

SUM=$(add $A $B)

echo "$A$B 的和为 $SUM"

10.2:系统函数

系统自带的函数。

这里只介绍两个系统函数。
以下两个函数都可在命令行中直接执行并看到结果。

basename()函数

功能:返回完整路径最后 “ / ” 的部分,常用于获取文件名。

参数

  1. pathname:绝对路径
  2. suffix:后缀,如果suffix被指定了,basename会将文件名中的suffix去掉。

示例:

basename /home/aaa/bbb/test.txt

basename /home/aaa/bbb/test.txt .txt

运行结果:

在这里插入图片描述

dirname()函数

功能:返回完整路径最后 “ / ” 的前面的部分,常用于获取路径。

参数

  1. dirname:绝对路径

示例:

dirname /home/aaa/bbb/test.txt

运行结果:

在这里插入图片描述

11:文件包含

和其他语言一样,shell 脚本也可以引用外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

语法格式

  • 方式一
. 文件名
  • 方式二
source 文件名

两个脚本不在同一目录时,要用绝对路径。
被包含的文件不需要可执行权限。
简单起见,通常用第一种方式。

示例:

inMain.sh 文件:

#!/bin/bash

# filename: inMain.sh

source inTest.sh

read -p "请输入第一个数:" A
read -p "请输入第二个数:" B

SUM=$(my_add $A $B)

echo "$A$B 的和为 $SUM"
echo ''
echo "str = $STR"

inTest.sh 文件:

#!/bin/bash

# filename: inTest.sh

function my_add() {
	S=$[$1+$2]
	echo $S
}

STR="this is inTest.sh"

运行结果:

在这里插入图片描述


是非入耳君须忍,半作痴呆半作聋。

——《警世》(明)唐寅

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

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

相关文章

Python自动发送消息小脚本,可用于各种聊天框~

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect 个…

安装k3s

k3s官方文档 architecture quick start 概述&#xff1a;k3s一个轻量级的kubernetes,因资源消耗知识kubernetes的一半&#xff0c;故取名k3s k3s的node分为 server node 和agent node: server node: 可以运行kubectl等命令&#xff0c;且包含 agent node的功能。agent node:…

【升级】专为小白设计的TypeScript入门课无密拟把疏狂图一醉

TypeScript&#xff1a;JavaScript的超集&#xff0c;提高代码可靠性和可维护性 【升级】专为小白设计的TypeScript入门课 download&#xff1a;https://www.666xit.com/3817/ 随着现代Web应用程序的复杂性增加&#xff0c;使用JavaScript编写大型项目变得越来越困难。TypeS…

Centos 安装MySQL

CentOS 安装 MySQL 1. 安装 VMware 以及 CentOS2. 安装 docker2.1 卸载&#xff08;可选&#xff09;2.2 安装 Docker2.3 启动 Docker2.4.配置镜像加速2.5 设置 Docker 开机自启 3. 安装 MySQL3.1 从docker镜像仓库中拉取mysql镜像3.2 创建实例&#xff0c;并启动3.3.查看docke…

20230422 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142. 环形链表 II

1、24. 两两交换链表中的节点 初始时&#xff0c;cur指向虚拟头结点&#xff0c;然后进行如下三步&#xff1a; 操作之后&#xff0c;链表如下&#xff1a; 看这个可能就更直观一些了&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* i…

camunda流程引擎send task节点用途

Camunda的Send Task用于向外部系统或服务发送消息。消息可以是同步或异步的&#xff0c;可以发送到队列、主题或其他类型的消息中间件。Send Task通常用于将消息发送到外部系统&#xff0c;而无需等待响应或结果。相反&#xff0c;它只是向外部系统发出信号&#xff0c;通知其执…

使用Storm proxies动态代理IP如何正确设置使用海外IP代理?

正确设置使用海外IP代理需要以下几个步骤&#xff1a; 获取代理服务器的IP地址和端口号&#xff1a;可以在代理服务提供商的网站上或者代理IP池中获取相应的信息。在计算机或移动设备上配置代理服务器&#xff1a;打开网络设置&#xff0c;找到代理服务器的设置选项&#xff0c…

10. 并查集

10. 并查集 并查集是一种树型的数据结构 &#xff0c;并查集可以高效地进行如下操作&#xff1a; 查询元素p和元素q是否属于同一组 合并元素p和元素q所在的组 10.1 并查集结构 并查集也是一种树型结构&#xff0c;但这棵树跟我们之前讲的二叉树、红黑树、B树等都不一样&…

项目风险管理的5个重点 不得不重视

风险管理持续贯穿软件项目的整个生命周期&#xff0c;其对项目的影响非常大&#xff0c;那么如何高效管理项目风险&#xff1f;5个风险管理重点如下&#xff1a; 1、风险识别和科学分析 需要对风险发生的可能性进行分析&#xff0c;判断风险对项目影响可能性并记录其特征&#…

【 初识 Spring MyBatis 查询数据库 】

文章目录 一、概念二、为什么学 MyBatis三、怎么学 MyBatis四、第⼀个MyBatis查询4.1 MyBatis 在整个框架中的定位4.2 准备&#xff1a;创建库和表4.3 配置 MyBatis 开发环境4.3.1 添加MyBatis框架⽀持4.3.1.1 ⽼项⽬添加支持扩展&#xff1a;在⽼项⽬中快速添加框架 - EditSta…

ChatGPT 速通手册——不同相似度算法的分值介绍

不同相似度算法的分值介绍 在信息大暴涨的今天&#xff0c;人类已经不可能出现通才、全才式的人物。利用 ChatGPT 来询问我们未知领域的知识是很好的习惯和用法。但对严肃知识的学习&#xff0c;一定要通过权威来源复核审校&#xff0c;保证自己所学知识的正确。否则&#xff…

【安全学习笔记】信息收集-CDN相关的技术(CDN绕过)

CDN相关的技术&#xff08;CDN绕过&#xff09; CDN&#xff1a;内容分发网络&#xff0c;它是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容…

104. 二叉树的最大深度【75】

难度等级&#xff1a;容易 上一篇算法&#xff1a; 101. 对称二叉树【74】 力扣此题地址&#xff1a; 104. 二叉树的最大深度 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;104. 二叉树的最大深度 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根…

【并发编程】Java并发之关键字synchronized使用和原理

文章目录 前言一、synchronized的四种应用方式修饰一个代码块修饰一个方法修饰一个静态的方法修饰一个类 二、synchronized底层语义原理三、理解Java对象头与Monitor四、synchronized代码块底层原理五、synchronized方法底层原理六、Java虚拟机对synchronized的优化偏向锁轻量级…

Finetuner+:为企业实现大模型微调和私有化部署

如 ChatGPT、GPT4 这样的大型语言模型就像是你为公司请的一个牛人顾问&#xff0c;他在 OpenAI、Google 等大公司被预训练了不少的行业内专业知识&#xff0c;所以加入你的公司后&#xff0c;你只需要输入 Prompt 给他&#xff0c; 介绍一些业务上的背景知识&#xff0c;他就能…

清除Github提交历史commit

如果提交代码到Github仓库时&#xff0c;不小心把敏感信息&#xff08;比如登陆账号和登陆密码&#xff09;提交了上去&#xff0c;尽快处理。 git log 查看提交记录 git log定位你误操作的那一个版本 ‘be757abcb2b6c2b86b489384aeb4619d9b8c94c7’ 比如这个是你提交版本的…

2023全网汇总PMP备考攻略(附答题技巧)

一&#xff0c;多复习和学习新版考纲 01《PMBOK》看三遍 这边建议看三遍《PMBOK》&#xff0c;更有利于我们巩固知识&#xff0c;查缺补漏。 第一遍 第一遍是老师带着我们去看。这个时候一定要非常专心&#xff0c;千万不要上课走神或者玩手机。因为这一遍老师会告诉我们&a…

FreeRTOS源码获取以及解释各个文件作用

1.源码可以在官网:FreeRTOS官网&#xff1a;https://www.freertos.org/下载 2.FreeRTOS源码内容介绍 名称 描述 FreeRTOS FreeRTOS内核 FreeRTOS-Plus FreeRTOS组件 tools 工具 GitHub-FreeRTOS-Home FreeRTOS的GitHub仓库链接 Quick_Start_Guide 快速入门指南官方…

C/C++ Linux进程操作

目录 一、简介 二、创建进程 1. fork 2. wait 3. exit 三、多进程高并发设计 四、孤儿进程 五、僵尸进程 六、守护进程 七、总结 一、简介 进程是什么&#xff1f; 答&#xff1a;可以简单理解为&#xff0c;一个 .exe 的应用程序&#xff0c;就是运行在进程中的&a…

ChatGPT时代,我们可能站到了自然语言编程的大门口

ChatGPT大火&#xff0c;我现在有种感觉&#xff1a;我们可能站到了自然语言编程的门口&#xff0c;一脚下去&#xff0c;也许能把门踹开。 当然&#xff0c;也可能会踢到一块铁板。 回顾我们的编程之路&#xff0c;基本上就是一个编程门槛不断降低的历史。 最早的一批前辈们…