什么是shell脚本和简单shell脚本练习

news2025/1/20 3:43:07

文章目录

  • 什么是shell脚本和简单shell脚本练习
    • 什么是shell脚本
      • 为什么要学习shell脚本
      • 第一个脚本编写与执行
      • 编写第一个脚本
    • 简单的shell脚本练习
      • 简单案例
      • 交互式脚本:变量内容由用户决定
      • 随日期变化:利用date建立文件
      • 数值运算:简单的加减乘除
      • 数值运算:通过bc计算Pi(圆周率)
    • 脚本的执行方式差异(source、sh script、./script)
      • 利用直接执行的方式来执行脚本
      • 利用source来执行脚本:在父进程中执行

什么是shell脚本和简单shell脚本练习

什么是shell脚本

什么是shell脚本呢(shell script,程序化脚本)呢?就字面上的意义,我们将它分为两部分。对于【shell】部分,我们在这篇博客记录过:https://blog.csdn.net/qq_52089863/article/details/130296403

就是在命令行下面让我们与系统沟通的一个工具接口。那么【script】是啥?字面意思就是【脚本、剧本】的意思。整句话来说shell脚本就是利用shell的功能所写的一个【程序】,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令),写在里面,搭配正则表达式、管道命令与数据流重定向等功能,达到我们所想要处理的目的。

shell脚本可以简单地被看成批处理文件,也可以被说成是一个程序文件,且这个程序语言由于都是利用shell与相关工具命令,所以不需要编译即可执行。此外,它还拥有不错的除错(debug)工具,能够帮助系统管理员快速地管理好主机

为什么要学习shell脚本

为什么要学习shell脚本呢,如果你不从事IT工作,只想要【会用】Linux而已,那么不需要学shell脚本也无所谓。但是,如果你是真的想要玩明白Linux,那么shell脚本肯定要学,因为shell脚本给我带来以下好处:

  1. ==自动化管理:==Shell脚本可以帮助管理员自动化管理一些重复性的任务,例如备份数据、批量修改文件、自动化部署等,从而提高工作效率和减少错误。
  2. ==系统管理:==Shell脚本可以帮助管理员进行系统管理,例如监测系统性能、管理进程、设置定时任务等。
  3. ==脚本编写:==Shell脚本是一种非常简单易懂的编程语言,掌握Shell脚本可以帮助开发人员快速编写一些小型脚本程序,例如数据处理、文本解析等。
  4. ==维护脚本:==在Linux系统中,很多应用程序都是通过脚本来启动和停止的,例如Apache、MySQL等,因此掌握Shell脚本可以帮助管理员更好地维护这些应用程序。
  5. ==调试程序:==Shell脚本是一种非常容易调试的编程语言,可以帮助开发人员快速定位程序中的错误并进行修复。

总之,学习Shell脚本对于Linux系统管理员和开发人员来说是非常重要的,可以帮助他们更好地进行系统管理和脚本编写,从而提高工作效率和减少错误。

第一个脚本编写与执行

shell脚本其实就是纯文本文件,我们可以编辑这个文件,然后让这个文件来帮我们一次执行多个命令,或是利用一些运算与逻辑判断来帮我们完成某些功能。在shell脚本的编写中需要注意下面的事项:

  1. 命令是从上而下、从左向右地分析执行
  2. 命令、选项与参数间的多个空格都会被忽略掉
  3. 空白行也将被忽略掉,并且【TAB】按键所产生的空白行视为空格键
  4. 如果读取到一个Enter符号,就尝试开始执行该行(或该串)命令
  5. 至于如果一行内容太多,则可以用【\Enter】来扩展至下一行
  6. 【#】可作为注释,任何加在#后面的数据将全部视为注释文字

这样一来,我写的脚本程序,就会被一行一行地执行,现在我们假设你写的这个程序文件名是/home/csq/shell.sh 那如何执行这个文件呢?

  • 直接命令行执行:shell.sh 文件必须要具备可读与可执行的权限(rx),然后:
    • 绝对路径:使用/home/csq/shell.sh 来执行命令
    • 相对路径:假设工作目录在/home/csq下,则使用【./shell.sh】来执行
    • 变量【PATH】功能:通过【bash shell.sh】或【sh shell.sh】来执行

重点就是让shell.sh文件必须要具备可读与可执行的权限才行

那么【sh shell.sh】也可以执行?这是因为/bin/sh其实就是/bin/bash(链接文件),使用sh shell.sh就是告诉系统,我想要直接以bash的功能来执行shell.sh 这个文件内相关命令的意思。所以说只要你shell.sh具有可读可执行的权限,就能用 sh 的参数。

image-20230427103722080

如上图 sh 指向 bash,如果不懂链接文件,可以自行查阅软硬链接的使用。

编写第一个脚本

学过语言的都知道一开始学都是从输出【Hello World】开始的,我们可以编一个输出Hello world的shell脚本:

[root@localhost ~]# mkdir shelldir ; cd shelldir
[root@localhost shelldir]# vim hello.sh
#!/bin/bash
# program:
#    Enter hello world on the screen
# History time:
# 2023/04/27    csq
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
echo -e "Hello World! \a \n"
exit=0
  1. 第一行 #!/bin/bash 在声明这个使用的shell名称

因为我们使用的是bash,所以,必须要以【#!/bin/bash】来声明这个文件内使用bash的语法。这样【#!】开头的行被称为shebang行。那么当这个程序被执行时,它就能够加载bash的相关环境配置文件(这个文件一般来说是~/.bashrc),并且执行bash来使我们下面的命令能够执行。这很重要,在很多错误的情况中,如果没有设置好这行,那么该程序可能会无法执行,因为系统可能无法判断该程序需要声明shell来执行。

  1. 程序说明内容

整个脚本当中,除了第一行【#!】是用来声明shell之外,其他的 # 都是【注释】用途。所以上面的程序当中,第二行以下就是用来说明整个程序的基本数据。一般来说,建议你一定要养成习惯,说明该脚本的:(1)内容与功能(2)版本信息(3)作者联络方式(4)建文件日期(5)历史记录等等,这样有助于未来程序的改写与调试

  1. 主要环境变量的声明

建议务必要将一些重要的环境变量设置好,PATH与LANG(如果有使用到输出相关的信息时)是当中最重要的。如此一来,我们这个程序在进行时,可以直接执行一些外部命令,而不必写绝对路径。

  1. 主程序部分

将主要的程序写好即可,在这个例子当中,就是echo 那一行

  1. 执行结果告知(定义返回值)

一个命令的成功与否,可以使用$?这个变量来观察?那么我们也可以利用exit这个命令来让程序中断,并且返回一个数值给系统。在此例中,使用exit 0,代表退出脚本并且返回一个0给系统,所以我执行完这个脚本后,若接着执行echo $? 则得到0的值。

接下来执行一下写的脚本

[root@localhost shelldir]# sh hello.sh 
Hello World!  

你会看到屏幕上已经输出了【Hello World!】 ,而且应该还会听到【咚】一声,这是因为\a 的这个转义字符,\a表示响铃字符,不过echo必须加上 -e的选项才行。

简单的shell脚本练习

简单案例

交互式脚本:变量内容由用户决定

很多时候我们需要用户输入一些内容,好让程序可以顺利运行。大家应该都有安装过软件的经验,安装的时候,它不是会问你【安装到哪个目录去】吗?那个让用户输入数据的操作,就是让用户输入变量内容。

请你以read命令的用途,编写一个脚本,它可以让用户输入:1. first name 2. last name 最后在屏幕上显示:【Your full name is】的内容:

[root@localhost shelldir]# vim showname.sh
#!/bin/bash
# program:
#          User inputs his first name and last name. Program shows his full name.
# History:
# 2023/04/27    csq
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
read -p "Please input your nickname:" nickname
read -p "Please input your full name:" fullname
echo -e "\nYour nickname is:${nickname}\nYour full name is:${fullname} \a " 

执行结果如下,你能够发现用户自己输入的变量可以让程序所使用,并且将它显示到屏幕上。

[root@localhost shelldir]# sh showname.sh 
Please input your nickname:xiaopang
Please input your full name:csq

Your nickname is:xiaopang
Your full name is:csq 

随日期变化:利用date建立文件

假设我的服务器内有数据库,数据库每天的数据都不太一样,因此当我备份时,我希望每天的数据备份成不同的文件名,这样才能让旧的数据也能够保存下来不被覆盖。应该怎么做呢?

考虑到每天的【日期】并不相同,所以将文件取成类似backup.2023-04-27.data,就可以每天一个不同的文件名了,那么2023-04-27怎么来呢?这就是重点。接下来出一个相关的例子:假设我想要建立三个空文件(通过touch),文件名最开头由用户输入决定,假如用户输入filename,而今天的日期是2023/04/27,我想要以前天、昨天、今天的日期来建立这些文件,即filename_2023/04/25、filename_2023/04/26、filename_2023/04/27,那该如何是好?

[root@localhost shelldir]# vim create_3_filename.sh
#!/bin/bash
# Program
#      Program create  three files , which name by user's input and date command
# History:
# 2023/04/27  csq
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
# 1.让使用者输入文件名称,并取得fileuser这个变量
echo "I will use 'touch' command to create three files"  # 显示信息
read -p "Please input your filenames:" fileuser          # 提示使用者输入
# 2.为了避免使用者随意按Enter,利用变量功能分析文件名是否设置?
filename=${fileuser:-"filename"}                         # 开始判断有否配置文件
# 3.利用date命令来取得所需要的文件名了
date1=$(date --date='2 days ago' +%Y%m%d)                # 前两天的日期
date2=$(date --date='1 days ago' +%Y%m%d)                # 前一天的日期
date3=$(date +%Y%m%d)                                    # 今天的日期
file1=${filename}${date1}                               # 下面三行配置文件名
file2=${filename}${date2}
file3=${filename}${date3}
touch "${file1}"                                      # 下面三行创建文件
touch "${file2}"
touch "${file3}"
echo -e "\n" 
ls -al "\n${fileuser}"*                                 # 查看创建的文件
echo -e "\a"

部分参数详解

date命令的–date参数用于指定日期或时间,以便在指定的格式下显示或操作日期和时间。
以下是一些常用的–date参数:

  1. “now”:表示当前时间。

  2. “yesterday”:表示昨天的日期。

  3. “tomorrow”:表示明天的日期。

  4. “next week”:表示下周的日期。

  5. “last month”:表示上个月的日期。

  6. "3 days ago":表示3天前的日期。

  7. “2 weeks from now”:表示2周后的日期。

  8. “3 months ago”:表示3个月前的日期。

  9. “next year”:表示明年的日期。

  10. “2 years ago”:表示2年前的日期。

–date参数还支持一些特殊的日期格式,如:

  1. YYYY-MM-DD:表示年-月-日的格式。

  2. MM/DD/YYYY:表示月/日/年的格式。

  3. DD-MMM-YYYY:表示日-月-年(月份用缩写)的格式。

  4. HH:MM:SS:表示小时:分钟:秒的格式。

  5. HH:MM:表示小时:分钟的格式。

date 的【+%Y%m%d】就是一些参数功能能显示今天的日期

执行结果如下

[root@localhost shelldir]# sh create_3_filename.sh 
I will use 'touch' command to create three files
Please input your filenames:lll

-rw-r--r--. 1 root root 0 427 18:06 lll20230425
-rw-r--r--. 1 root root 0 427 18:06 lll20230426
-rw-r--r--. 1 root root 0 427 18:06 lll20230427

数值运算:简单的加减乘除

我们在之前的博客中写过declare来定义变量类型,当变量定义成为整数后才能够进行加减运算。此外我们也可以利用【$((计算式))】来进行数值运算。可惜的是bash shell里面默认仅支持到整数的数据而已。例如:我们要让用户输入两个变量,然后将两个变量的内容相乘,最后输出相乘的接管,那可以怎么做呢?

[root@localhost shelldir]# vim chengfa.sh 
#!/bin/bash
# program
#         User inputs 2 integer numbers;Calculate the product of two numbers
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
read -p "Please input No.1 int:" onenumber
read -p "Please input NO.2 int:" twonumber
product= $((${onenumber}*${twonumber}))
echo -e "\nproduct is ${product} \a"

执行结果

[root@localhost shelldir]# sh chengfa.sh 
Please input No.1 int:999
Please input NO.2 int:888

product is 887112 

在数值运算上面可以使用【declare -i product=${onenumber}*${twonumber}】,也可以使用上面的方式来进行。比较建议使用这种方法

var=$((运算内容))

这种方法很容易记忆。未来你可以使用这种方式来计算。至于数值运算上的处理,则有+、-、*、/、%等。%是取余的,举例来说,15对7取余数,结果就是15=2*7+1,所以余数就是1

[root@localhost shelldir]# echo $((15 % 7))
1

如果你要计算含有小数点的数据时,其实可以通过bc这个命令的协助

[root@localhost shelldir]# echo "123.456*789.123" | bc
97421.969

数值运算:通过bc计算Pi(圆周率)

其实计算Pi,小数点以下位数可以无限地扩展下去,而bc提供了一个运算Pi的函数,要使用该函数必须通过bc -l来调用才行。也因为这个小数点的位数可以无限扩展运算的特性存在,所以我们可以通过下面这个小脚本来让用户输入一个【小数点位】,让Pi能够更准确

[root@localhost shelldir]# vim cal_pi.sh
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
echo -e "This program will calculate pi value.\n"
echo -e "Your should input a float number to calculate pi value.\n"
read -p "The scale number (10~10000) ?" checking
num=${checking:-"10"}            # 判断是否有输入数值,如果没有默认输入10
echo -e "Starting calcuate pi value . Be patient.\n"
time echo "scale=${num}; 4*a(1)" | bc -lq

上述数据中,那个4*a(1) 是bc主动提供的一个计算Pi的函数,至于scale就是要bc计算几个小数点位数的意思。scale的数值越大,代表Pi要被计算得越精确,当然用掉的时间就会越多。因此,你可以尝试输入不同的数值看看,不过最好不要超过5000,因为会算很久。会让COU达到高负载的状态。

脚本的执行方式差异(source、sh script、./script)

不同的脚本执行方式会造成不一样的结果,尤其对bash的环境影响很大。脚本的执行除了前面使用的【sh script】 以外还可以利用 【source 】或小数点【.】来执行。那么这些执行方式有何不同呢?

利用直接执行的方式来执行脚本

当使用直接命令执行(不论是绝对路径/相对路径还是${PATH}内),或是利用bash(或sh)来执行脚本时,该脚本都会使用一个新的bash环境来执行脚本内的命令。也就是说,使用这种执行方式时,其实脚本是在子进程的bash内执行的。在之前的博客写过 export 功能,在里面写过子进程和父进程概念性的问题,重点在于【当子进程完成后,在子进程内的各项变量或操作会结束而不会传回到父进程中】

我们使用上面缩写的showname.sh脚本做个实验,这个脚本可以让用户设置两个变量,分别是firstname与lastname。想一想,如果你直接执行该行命令,该命令帮你设置的firstname会不会生效呢?

[root@localhost shelldir]# echo ${nickname} ${fullname}
            <==两个变量并不存在
[root@localhost shelldir]# sh showname.sh 
Please input your nickname:xiaopang       # 这里是用户自己输入的变量
Please input your full name:csq

Your nickname is:xiaopang                 # 脚本运行成功,这两个变量有效
Your full name is:csq  
[root@localhost shelldir]# echo ${nickname} ${fullname}
       <== 事实上,这两个变量在父进程的bash中还是不存在的

上面的结果很奇怪,怎么我已经利用showname.sh设置号的变量竟然在bash环境下面无效。我们以下图说明

image-20230427205247525

当你使用直接执行的方法来处理时,系统会给予一个新的bash让我们来执行showname.sh 里面的命令,因此你的nickname和fullname等变量其实是在下图的子进程bash内执行的,当showname.sh执行完毕后,子进程bash内的所有数据便被删除,因此【echo ${nickname} ${fullname}】时,就看不到任何东西了。

利用source来执行脚本:在父进程中执行

如果你使用source 来执行命令那就不一样了,同样的脚本我们来执行看看

[root@localhost shelldir]# source showname.sh 
Please input your nickname:xiaopang
Please input your full name:csq

Your nickname is:xiaopang
Your full name is:csq  
[root@localhost shelldir]# echo ${nickname} ${fullname}
xiaopang csq     # 有数据产生了!

竟然生效了,没错因为source对脚本的执行方式可以使用下面的图例来说明,showname.sh会在父进程中执行,因此各项操作都会在原本的bash内生效。这也是为啥你不注销系统而要让某些写入~/.bashrc的设置生效时,需要使用【source ~/.bashrc】而不能使用【bash ~/.bashrc】。

image-20230427210128792

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

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

相关文章

java内存占用过大分析,mat内存快照分析

背景 最近功能模块上线后&#xff0c;生产内存占用显著提升&#xff0c;查看gc日志发现年轻代频繁从2G回收到60M左右&#xff0c;猜测是在方法中频繁创建大对象导致&#xff0c;由于一时间无法通过review代码找出问题所在&#xff0c;只好将生产jvm内存快照dump后通过java mem…

Zotero+坚果云打造多设备同步的文献管理工具(保姆级教程)

Zotero坚果云打造多设备同步的文献管理工具&#xff08;保姆级教程&#xff09; 文章目录 Zotero坚果云打造多设备同步的文献管理工具&#xff08;保姆级教程&#xff09;Zotero介绍所需软件或插件实现方式步骤1&#xff1a;坚果云配置步骤2&#xff1a;Zotero配置步骤3&#x…

细讲shell中的循环语句--for语句

目录 一:何为循环 1.循环概述 2.使用循环的好处 二&#xff1a;for循环语句 1.for语句的用法 ​2. 语法结构 &#xff08;1&#xff09;一般格式 &#xff08;2&#xff09;类C语言格式 &#xff08;3&#xff09;死循环 3.事例 ​4.常用转义符 5.制作九九乘法表 三&…

旧照片修复-模糊图片变清晰-2023年度最强神器 codeformer

CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发。该模型通过结合了VQGAN和Transformer等技术&#xff0c;可以通过提供模糊或马赛克图像来生成清晰的原始图像。 功能&#xff1a; 1、老照片修复 2、黑白照片彩色…

LeetCode 2641 二叉树的堂兄弟节点 II

LeetCode 2641 二叉树的堂兄弟节点 II 给你一棵二叉树的根 root &#xff0c;请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。 如果两个节点在树中有相同的深度且它们的父节点不同&#xff0c;那么它们互为 堂兄弟 。 请你返回修改值之后&#xff0c;树的根 root …

【Auto-GPT云部署】

部署自己的Auto-Gpt 先说说什么是Chat-Gpt Chat-GPT (Generative Pretrained Transformer)是由OpenAI提出的一种自然语言处理技术&#xff0c;是基于Transformers和预训练机制的大规模语言模型。与传统的基于规则或基于统计的自然语言处理方法不同&#xff0c;Chat-GPT使用深…

【网络抓包工具】tcpdump 最新版本移植到开发板(海思平台)

目录 一、概述 二、libpcap、tcpdump源码下载 三、libpcap、tcpdump交叉编译  &#x1f449;3.1 交叉编译 libpcap  &#x1f449;3.2 交叉编译 tcpdump 一、概述 tcpdump是一个功能强大的&#xff0c;用于抓取网络数据包的命令行工具&#xff0c;与带界面的Wireshark一样&am…

CLion开发工具 | 02 - 常用功能配置介绍

专栏介绍 配置项概览 CLion有非常多的配置项&#xff0c;本文将列举一些常用的配置项。 一、外观配置 1. 主题 2. 新UI 新的UI有点VScode化&#xff0c;个人不太喜欢&#xff0c;还是老的这套UI香&#xff0c;所以未开启&#xff1a; 3. 环境变量 IDE除了导入系统/用户的…

应急管理指挥中心大数据信息化管控平台建设方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 篇幅有限&#xff0c;无法完全展示&#xff0c;喜欢资料可转发评论&#xff0c;私信了解更多信息。

力扣刷题2023-04-27-1——题目:1329. 将矩阵按对角线排序

题目&#xff1a; 矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线&#xff0c;沿右下方向一直到矩阵末尾的元素。例如&#xff0c;矩阵 mat 有 6 行 3 列&#xff0c;从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。 …

宝塔防火墙拦截页面代码模板2

宝塔防火墙拦截页面代码模板2 防火墙代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>云防御<…

最优化方法Python计算:一元函数搜索算法——黄金分割法

黄金分割法是包围策略的经典用例。算法思路为&#xff1a;假定目标函数 f ( x ) f(x) f(x)最优解 x 0 x_0 x0​含于长度为 λ \lambda λ的区间 ( a 0 , b 0 ) (a_0,b_0) (a0​,b0​)内。在区间内插入两个备选点 a 1 ′ , b 1 ′ ∈ ( a 0 , b 0 ) a_1,b_1\in(a_0,b_0) a1′​,…

【网络编程】网络基础

目录 一、协议分层 1、为什么要分层 2、OSI七层模型 3、TCP/IP四层协议&#xff08;五层协议&#xff09; 二、网络传输流程 1、同一个网段内的两台主机进行文件传输 2、跨网段的主机的文件传输 三、IP地址和MAC地址 1、IP地址 2、MAC地址 网络通信的本质就是跨主机的…

Python 输出日志 print 函数的应用(python专栏001)

在Python中&#xff0c;print()函数是一个用于输出内容到标准输出设备的函数&#xff0c;通常用于调试程序和显示程序运行结果 直接使用如下&#xff1a; print(5) print("早起的年轻人")print()函数可以接受多个参数&#xff0c;将它们用空格隔开&#xff0c;并输…

Docker CE介绍和CentOS7.5.1804离线安装Docker CE

文章目录 Docker CE介绍离线安装问题离线安装步骤Docker CE 的优点 Docker CE介绍 Docker CE&#xff08;CE&#xff0c;Community Edition是社区版本的意思&#xff09;是一个免费、开源的应用容器化平台&#xff0c;可帮助开发人员将应用程序打包成容器&#xff0c;并在任何…

【小白入门Linux】—目录结构介绍(一)

【小白入门Linux】—目录结构介绍&#xff08;一&#xff09; linux的方向&#xff1a; linux运维 linux嵌入式开发 在linux下做各种程序开发 应用领域 个人桌面领域 服务器领域&#xff08;java c程序部署到linux服务器&#xff09; 嵌入式&#xff08;运行稳定&#x…

GRE-MGRE综合实验

拓扑结构&#xff1a; 要求 1、R5为网络运营商&#xff08;ISP&#xff09;&#xff0c;接口IP地址均为公有地址&#xff1b; 2、R1与R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b;R2与R5间使用PPP的chap认证&#xff0c;R5为主认证方&#xff1b;R3与R5间使用HD…

操作系统进程线程(一)—进程线程协程区别、多进程多线程、进程调度算法、进程线程通信

进程线程协程区别 定义上 进程&#xff1a;资源分配和拥有的基本单位&#xff0c;是调度的基本单位。运行一个可执行程序会创建一个或者多个进程&#xff1b;进程就是运行起来的程序线程&#xff1a;程序执行基本单位&#xff0c;轻量级进程。每个进程中都有唯一的主线程&…

React之Redux的使用

文章目录 Redux 介绍概述Redux 是什么&#xff1f;为什么要使用 Redux&#xff1f;我什么时候应该使用 Redux&#xff1f;Redux 库和工具React-ReduxRedux ToolkitRedux DevTools 扩展 Redux 术语和概念State 管理不可变性 Immutability术语ActionAction CreatorReducerReducer…

ChatGPT会一直火热下去吗?他会是下一个AR,区块链吗?

目录 前言 VR 热潮 区块链热潮 元宇宙热潮 ChatGPT 热潮 理智看待 ChatGPT 前言 如果在今年年底评选 2023 年的年度科技热词&#xff0c;以 ChatGPT 目前的热度&#xff0c;毫无疑问会是今年排名第一的科技热词。 即使今年才过去四个月&#xff0c;但我很难想象还有什么科…