bash脚本学习笔记

news2024/11/20 20:44:35

一、扫盲

脚本文件是一种文本文件,其中包含了一系列的命令和指令,可以被操作系统解释器直接解释执行。脚本文件通常被用来完成特定的任务或执行重复性的操作。

脚本文件通常以某种编程语言的语法编写,例如 Bash、Python、Perl、Ruby 等等。它们可以在 Linux、Unix、macOS、Windows 等不同的操作系统上运行,嵌入式设备的操作系统中也经常使用脚本文件来完成各种任务。

脚本文件有很多用途,例如:

  • 自动化任务:通过编写脚本文件可以自动化一些重复性的任务,比如备份数据、部署软件、执行定时任务等等。
  • 执行系统管理任务:管理员可以通过编写脚本文件快速地管理系统,比如创建用户、修改权限、安装软件等等。
  • 编写辅助工具:脚本文件还可以被用作编写辅助工具,比如计算器、日历、单位转换器等等。

总之,脚本文件是一种非常强大的工具,可以使我们的工作更加高效和简单。

Bash 是 shell 的一种,而 shell 则是通用的 Unix/Linux 命令行解释器。因此,所有的 Bash 脚本都是 shell 脚本,但并不是所有的 shell 脚本都是 Bash 脚本。

二、bash脚本文件的编写语法格式

Bash 脚本文件是一种文本文件,其中包含了一系列的命令和指令,可以被 Bash 解释器直接解释执行。以下是 Bash 脚本编写的语法格式:

  1. shebang 行:每个 Bash 脚本文件都应该以 shebang 行开头,告诉系统要使用哪个解释器来解释执行脚本。示例:#!/bin/bash

  2. 注释:以 # 开头的行是注释,不会被解释器执行。注释可以用于描述代码的功能、提醒自己或其他人后续需要完成的工作等。

  3. 变量定义:在脚本中可以定义变量并使用它们。Bash 中的变量名必须以字母或下划线开头,不能以数字开头,变量名区分大小写。变量赋值可以使用等号(=),但是等号两侧不能有空格。示例:name="John"

  4. 函数定义:在脚本中可以定义函数并在脚本中进行调用。函数有名称、参数和代码块,调用函数时可以传递参数给函数。示例:

    function say_hello {
        echo "Hello, $1!"
    }
    
  5. 条件语句:可以使用 if、elif 和 else 关键字来编写条件语句。条件语句根据条件的真假来决定是否执行某段代码。示例:

    if [ "$name" == "John" ]; then
        echo "Your name is John"
    else
        echo "Your name is not John"
    fi
    
  6. 循环语句:可以使用 for 和 while 关键字来编写循环语句。循环语句可以重复执行某段代码块。示例:

    for i in {1..5}; do
        echo $i
    done
    
    while true; do
        echo "Hello, World!"
        sleep 1
    done
    
  7. 输入输出:可以使用 echo 命令输出信息到标准输出流,也可以使用 read 命令从标准输入流中读取用户输入。示例:

    echo "Enter your name:"
    read name
    echo "Hello, $name!"
    

以上是 Bash 脚本编写的基本语法格式,需要注意的是,每个语句都是以换行符结束的,如果一条语句太长,可以使用反斜杠(\)折行。同时,缩进不是必需的,但它可以使代码更易于阅读和理解。

补充:

  • Shebang行是指Bash脚本文件的第一行,它用来指定该脚本将要使用哪个解释器来执行。Shebang行以井号(#)和叹号(!)字符“#!”开头,后面紧跟着解释器的完整路径和名称。

    Shebang行不仅仅是用于Bash脚本文件,它还可以用于其他编程语言或解释器。

  • 在Bash脚本中,echo是一个用于向终端输出文本的命令。它可以接受一个或多个字符串作为参数,并将它们打印到标准输出(通常是终端窗口)上。

  • 在脚本中,$符号可以用于多种不同的用途,以下是其中一些最常见的用法:

    1. 变量引用:在Bash脚本中,$后跟一个变量名可以引用该变量的值。例如,如果变量foo的值为"hello",则echo $foo将输出"hello"。
    2. 命令替换:在Bash脚本中,$()或``可以将命令的输出插入到另一个命令或语句中。例如,echo $(ls)将输出当前目录中的所有文件和文件夹的列表。

三、获取linux内存、cpu、磁盘IO等信息脚本编写

https://mp.weixin.qq.com/s/lOVFgO4ZwJDXksitthdp5A

yikou.sh 代码如下:

#!/bin/bash
# 获取要监控的本地服务器IP地址
IP=`ifconfig | grep inet | grep -vE 'inet6|127.0.0.1' | awk '{print $2}'`
echo "IP地址:"$IP
 
# 获取cpu总核数
cpu_num=`grep -c "model name" /proc/cpuinfo`
echo "cpu总核数:"$cpu_num
 
# 1、获取CPU利用率
################################################
#us 用户空间占用CPU百分比
#sy 内核空间占用CPU百分比
#ni 用户进程空间内改变过优先级的进程占用CPU百分比
#id 空闲CPU百分比
#wa 等待输入输出的CPU时间百分比
#hi 硬件中断
#si 软件中断
#################################################
# 获取用户空间占用CPU百分比
cpu_user=`top -b -n 1 | grep Cpu | awk '{print $2}' | cut -f 1 -d "%"`
echo "用户空间占用CPU百分比:"$cpu_user
 
# 获取内核空间占用CPU百分比
cpu_system=`top -b -n 1 | grep Cpu | awk '{print $4}' | cut -f 1 -d "%"`
echo "内核空间占用CPU百分比:"$cpu_system
 
# 获取空闲CPU百分比
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $8}' | cut -f 1 -d "%"`
echo "空闲CPU百分比:"$cpu_idle
 
# 获取等待输入输出占CPU百分比
cpu_iowait=`top -b -n 1 | grep Cpu | awk '{print $10}' | cut -f 1 -d "%"`
echo "等待输入输出占CPU百分比:"$cpu_iowait
 
#2、获取CPU上下文切换和中断次数
# 获取CPU中断次数
cpu_interrupt=`vmstat -n 1 1 | sed -n 3p | awk '{print $11}'`
echo "CPU中断次数:"$cpu_interrupt
 
# 获取CPU上下文切换次数
cpu_context_switch=`vmstat -n 1 1 | sed -n 3p | awk '{print $12}'`
echo "CPU上下文切换次数:"$cpu_context_switch
 
#3、获取CPU负载信息
# 获取CPU15分钟前到现在的负载平均值
cpu_load_15min=`uptime | awk '{print $11}' | cut -f 1 -d ','`
echo "CPU 15分钟前到现在的负载平均值:"$cpu_load_15min
 
# 获取CPU5分钟前到现在的负载平均值
cpu_load_5min=`uptime | awk '{print $10}' | cut -f 1 -d ','`
echo "CPU 5分钟前到现在的负载平均值:"$cpu_load_5min
 
# 获取CPU1分钟前到现在的负载平均值
cpu_load_1min=`uptime | awk '{print $9}' | cut -f 1 -d ','`
echo "CPU 1分钟前到现在的负载平均值:"$cpu_load_1min
 
# 获取任务队列(就绪状态等待的进程数)
cpu_task_length=`vmstat -n 1 1 | sed -n 3p | awk '{print $1}'`
echo "CPU任务队列长度:"$cpu_task_length
 
#4、获取内存信息
# 获取物理内存总量
mem_total=`free | grep Mem | awk '{print $2}'`
echo "物理内存总量:"$mem_total
 
# 获取操作系统已使用内存总量
mem_sys_used=`free | grep Mem | awk '{print $3}'`
echo "已使用内存总量(操作系统):"$mem_sys_used
 
# 获取操作系统未使用内存总量
mem_sys_free=`free | grep Mem | awk '{print $4}'`
echo "剩余内存总量(操作系统):"$mem_sys_free
 
# 获取应用程序已使用的内存总量
mem_user_used=`free | sed -n 3p | awk '{print $3}'`
echo "已使用内存总量(应用程序):"$mem_user_used
 
# 获取应用程序未使用内存总量
mem_user_free=`free | sed -n 3p | awk '{print $4}'`
echo "剩余内存总量(应用程序):"$mem_user_free
 
 
# 获取交换分区总大小
mem_swap_total=`free | grep Swap | awk '{print $2}'`
echo "交换分区总大小:"$mem_swap_total
 
# 获取已使用交换分区大小
mem_swap_used=`free | grep Swap | awk '{print $3}'`
echo "已使用交换分区大小:"$mem_swap_used
 
# 获取剩余交换分区大小
mem_swap_free=`free | grep Swap | awk '{print $4}'`
echo "剩余交换分区大小:"$mem_swap_free
 

#5、获取磁盘I/O统计信息
echo "指定设备(/dev/sda)的统计信息"
# 每秒向设备发起的读请求次数
disk_sda_rs=`iostat -kx | grep sda| awk '{print $4}'`
echo "每秒向设备发起的读请求次数:"$disk_sda_rs
 
# 每秒向设备发起的写请求次数
disk_sda_ws=`iostat -kx | grep sda| awk '{print $5}'`
echo "每秒向设备发起的写请求次数:"$disk_sda_ws
 
# 向设备发起的I/O请求队列长度平均值
disk_sda_avgqu_sz=`iostat -kx | grep sda| awk '{print $9}'`
echo "向设备发起的I/O请求队列长度平均值"$disk_sda_avgqu_sz
 
# 每次向设备发起的I/O请求平均时间
disk_sda_await=`iostat -kx | grep sda| awk '{print $10}'`
echo "每次向设备发起的I/O请求平均时间:"$disk_sda_await
 
# 向设备发起的I/O服务时间均值
disk_sda_svctm=`iostat -kx | grep sda| awk '{print $11}'`
echo "向设备发起的I/O服务时间均值:"$disk_sda_svctm
 
# 向设备发起I/O请求的CPU时间百分占比
disk_sda_util=`iostat -kx | grep sda| awk '{print $12}'`
echo "向设备发起I/O请求的CPU时间百分占比:"$disk_sda_util
  • ifconfig:这个命令用于显示系统中网络接口的配置情况,包括网络接口名称、MAC地址、IP地址等信息。

    grep -vE 'inet6|127.0.0.1':使用 grep 命令去掉包含 “inet6”、“127.0.0.1” 的行,因为这些行分别表示 IPv6 地址和本地回环地址。

    -v 参数表示反向选择(invert match),即只显示不包含匹配模式的行,相当于进行匹配模式的取反操作。

    -E 参数表示使用扩展正则表达式(extended regular expression)进行匹配。扩展正则表达式支持更多的元字符和语法,例如 | 表示或,() 表示分组等。

    通常情况下,我们需要获取的 IP 地址是可以被外部访问的公网 IP 地址,而不是本地IP地址。因此,这行代码使用了 grep -vE 'inet6|127.0.0.1' 命令过滤掉了本地IP地址和IPv6地址,只返回非本地IP地址。这样就可以确保获得的 IP 地址是可以被外部网络访问的公网 IP 地址。

    awk '{print $2}':使用 awk 命令提取 IP 地址所在的列,也就是第二列,然后打印出来。

    awk 是一种文本处理工具,awk '{print $2}' 中的 $2 表示输出当前行(即 grep 命令过滤后的结果)中的第二个字段,这里的字段指的是按照空格或制表符分隔的一段文本。默认情况下,awk 会以空格或制表符为分隔符将每一行分成多个字段

  • grep 中的-c 参数让 grep 命令输出字符串匹配的行数(或者说计算匹配数量)。

  • top -b -n 1:执行top命令,以非交互方式显示系统进程信息,其中“-b”选项表示以批处理模式运行,不需要进行交互;“-n 1”选项表示只显示1次信息后就退出。

    grep Cpu:在top命令的输出中查找包含"Cpu"字符串的行。

    awk '{print $2}':对于每个包含"Cpu"字符串的行,使用awk命令取出第二个字段,即"Cpu"使用率的数值(例如,如果该行的内容为"Cpu(s): 1.2%us, 0.8%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st",则取出的数值为"1.2%us").

    cut -f 1 -d "%": 对于上一步得到的数值(如"1.2%us"),使用cut命令取出第1个字段(即去掉末尾的百分号)并赋值给变量cpu_user

    -f 1这个选项指定要提取的字段,这里是第一个字段。如果文本数据中以多个字符分隔字段,可以使用逗号分隔的数字列表指定多个字段(例如 -f 1,3)。

    -d "%"这个选项指定字段之间的分隔符,这里是 “%”。如果不指定分隔符,cut 命令默认使用制表符 \t 作为分隔符。

  • vmstat -n 1 1:这个命令会打印出当前系统的一些性能指标,每隔1秒更新一次,一共更新1次,然后就退出了。其中,-n只显示一次报头,而不是定期显示。,而只打印出实时值;1表示每隔1秒打印一次;第二个1表示只打印1次。

    sed -n 3p:这个命令会从vmstat的输出中取出第三行。因为vmstat的输出的前两行是表头,第三行才是我们需要的数据。-n 选项表示“安静模式”,即只输出经过sed处理的内容,而不是原始文本。3p 表示只打印出输入中的第3行。其中,数字3是行号,而p则表示打印。

  • uptime:这个命令用于显示系统当前的负载平均值

  • free:这个命令用于查看系统内存的使用情况。它会输出当前系统的空闲和已用内存量、缓冲区和缓存所占用的内存量等信息。

    grep Memfree命令的输出包含了多个内存相关的行,这里使用grep命令过滤出包含Mem关键字的行。这个关键字用于标识当前系统内存的使用情况。

运行结果:

在这里插入图片描述

四、利用cyclictest和GNUplot绘制延迟图的脚本

mklatencyplot.bash 代码如下:

#!/bin/bash

# 1. 运行 cyclictest
# /home/zhang/rt-tests-1.0/cyclictest -i 100 -p 50 -n -t -D 10m -h5000 -q --policy=fifo >output

# 2. 获取最大延迟时间
max=`grep "Max Latencies" output | tr " " "\n" | sort -n | tail -1 | sed s/^0*//`

# 3. Grep数据行,删除空行并创建一个公共字段分隔符
grep -v -e "^#" -e "^$" output | tr " " "\t" >histogram 

# 4. 设置内核的数量
cores=4

# 5. 为每个核创建包含延迟类别和频率值的两列数据集
for i in `seq 1 $cores`
do
  column=`expr $i + 1`
  cut -f1,$column histogram >histogram$i
done

# 6. 创建plot命令头
echo  "set title \"Latency plot\"\n\
set terminal png\n\
set xlabel \"Latency (us), max $max us\"\n\
set logscale y\n\
set xrange [0:5000]\n\
set yrange [0.8:*]\n\
set ylabel \"Number of latency samples\"\n\
set output \"plot.png\"\n\
plot \\" >plotcmd

# 7. 追加绘图命令数据引用
for i in `seq 1 $cores`
do
  if test $i != 1
  then
    echo -n ", " >>plotcmd
  fi
  cpuno=`expr $i - 1`
  if test $cpuno -lt 10
  then
    title=" CPU$cpuno"
   else
    title="CPU$cpuno"
  fi
  echo -n "\"histogram$i\" using 1:2 title \"$title\" with histeps" >>plotcmd
done

# 8. 执行plot命令
gnuplot -persist <plotcmd
  • |:管道符号,表示将上一条命令的输出作为下一条命令的输入

  • sort 命令按数字大小对每个最大延迟值进行排序, -n 参数表示将值视为数字进行排序。这种排序方式默认是从小到大排序的,如果需要按照从大到小的顺序对行进行排序,可以使用-r选项

  • sed是一种流编辑器,它用于对文件进行基本的文本转换和过滤操作。

    sed s/^0*//:该指令使用了正则表达式, s是替换命令 ,替换命令的语法格式为s/old/new/;^0* 匹配行首的所有零,^ 表示匹配行首,0* 表示匹配零个或多个连续的零

    需要注意的是,在使用该指令时,如果在正则表达式中使用了 ^,则需要将其放在引号或反斜杠中,以避免 shell 解释器将其解释为行首字符,从而导致错误。

    在正则表达式中,^(脱字符)表示匹配文本的开头位置。它可以用于多种情况下,例如:

    1. ^pattern:表示以pattern开始的字符串。例如,正则表达式^Hello将匹配以Hello开头的字符串。
    2. [^characters]:表示不属于characters中任何一个字符的单个字符。例如,正则表达式[^aeiou]将匹配不包含元音字母的单个字符。
    3. ^(pattern):表示将pattern作为整个字符串的组,并从第一个字符开始匹配该组。这种语法通常与后续的数量词一起使用。例如,正则表达式^(ab)+将匹配以连续出现的ab开头的字符串。

    需要注意的是,^在方括号外面和里面的含义是不同的

  • grep: 这是一个查找文件中匹配文本的命令

    -v: grep的一个选项,表示匹配不包含模式的行

    -e: grep的一个选项,表示后面跟随的是模式

    ^ 表示匹配行的开头,而 $ 表示匹配行的结尾。因此, ^$ 表示匹配既没有开头字符也没有结尾字符的行,也就是空行。

    tr: 这是一个字符转换命令,用于将文件中的一个字符转换为另一个字符

  • gnuplot工具官网:http://www.gnuplot.info/

    参数logscale默认以 10 为低

  • echo中的-n选项表示不在输出末尾添加换行符

  • Gnuplot命令中的with histeps表示使用直方图而不是条形图来绘制柱状图

    直方图通常用于表示连续型的数据,例如时间、长度或者重量等。直方图的矩形通常是连续的,没有空隙

    条形图可以很好地展示不同类别之间的数据分布情况,例如对比不同商品的销售量、对比不同城市的人口等。条形图的矩形之间通常是有间隔的

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

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

相关文章

IDEA JDBC配置

一、在pom中添加依赖 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies> 然后同步一下 二、编写代码…

Linux 系统服务

一、CentOS 6 与 CentOS 7开机流程 1.CentOS 6 1.1.打开电源首先通过内核引导开机。 1.2.开机自检&#xff0c;加载 BIOS 硬件信息。 1.3.MBR 记录一般是在磁盘0磁道0扇区&#xff0c;共512个字节。前446个字节是 BootLoder。计算机不知道我们的系统在哪里&#xff0c;所以需…

【Java数据结构】模拟实现ArrayList

import java.util.Arrays;/*** ArrayList的模拟实现*/ class SeqList{private int[] elem;private int usedSize0;//记录当前顺序表有多少个有效数字public static final int DEFAULT_CAPACITY10;//默认大小是10public SeqList(){this.elemnew int[DEFAULT_CAPACITY];}//新增元…

基于FFT + CNN -Transformer时域、频域特征融合的电能质量扰动识别模型

目录 往期精彩内容&#xff1a; ​模型整体结构 1 快速傅里叶变换FFT原理介绍 第一步&#xff0c;导入部分数据&#xff0c;扰动信号可视化 第二步&#xff0c;扰动信号经过FFT可视化 2 电能质量扰动数据的预处理 2.1 导入数据 2.2 制作数据集 3 基于FFTCNN-Transform…

服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测

知识点&#xff1a; 1、端口协议-弱口令&未授权&攻击方式等 2、桌面应用-社交类&文档类&工具类等 章节点&#xff1a; 1、目标判断-端口扫描&组合判断&信息来源 2、安全问题-配置不当&CVE漏洞&弱口令爆破 3、复现对象-数据库&中间件&…

AS-V1000产品介绍:支持GA/T1400视图库标准(可通过GA/T1400接入海康、华为、大华等图传前端设备,实现图传功能)

目 录 一、概述 二、AS-V1000视频监控管理平台的特点 二、视频监控平台通过GA/T1400接入前端设备 &#xff08;一&#xff09;接入华为GA/T1400前端设备 &#xff08;二&#xff09;接入大华GA/T1400前端设备 &#xff08;三&#xff09;接入海康威视GA/…

QML ListView 列表视图

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 虽然 Repeater 在重复创建多个相似项的时候很方便,但是通常只适用于有限的简单元素,并且它还无法滚动浏览。而基于 Flickable 的视图组件(如 GridView、ListView、TableView、TreeView 等)则弥补了这些缺…

vue-3d-model

vue-3d-model - npm GitHub - hujiulong/vue-3d-model: &#x1f4f7; vue.js 3D model viewer component 通过该插件降低Threejs的使用难度 vue项目加载三维模型&#xff0c;我把模型放在了服务器的tomcat里面&#xff0c;需要对tomcat的fbx项目文件夹设置跨域&#xff0c;如…

Docker容器引擎(5)

目录 一.docker-compose docker-compose的三大概念&#xff1a; yaml文件格式&#xff1a; json文件格式&#xff1a; docker-compose 配置模板文件常用的字段&#xff1a; 二.Docker Compose 环境安装&#xff1a; 查看版本&#xff1a; 准备好nginx 的dockerfile的文…

微信小程序(三十一)本地同步存储API

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.存储数据 2.读取数据 3.删除数据 4.清空数据 源码&#xff1a; index.wxml <!-- 列表渲染基础写法&#xff0c;不明白的看上一篇 --> <view class"students"><view class"item…

银行数据仓库体系实践(16)--数据应用之财务分析

总账系统 在所有公司中&#xff0c;财务分析的基础都是核算&#xff0c;那在银行的系统体系中&#xff0c;核算功能在业务发生时由业务系统如核心、贷款、理财中实现登记&#xff0c;各业务系统会在每天切日后统计当天各机构的核算科目的发生额与余额&#xff0c;并统一送到总账…

k8s二进制及负载均衡集群部署详解

目录 常见部署方式 二进制部署流程 环境准备 操作系统初始化配置 关闭防火墙 配置SELinux 关闭SWAP 根据规划设置主机名 在master添加hosts&#xff0c;便于主机名解析 调整内核参数 配置时间同步 部署docker引擎 在所有node节点部署docker引擎 部署etcd集群 签发…

shell脚本自动备份数据库表

今日目标&#xff1a;shell脚本自动备份数据库中的表并记录执行日志和mysql输出日志 编写思路&#xff1a; &#xff08;1&#xff09;shell脚本运行mysql命令 &#xff08;2&#xff09;脚本输出记录到日志中 &#xff08;3&#xff09;定时任务自动执行shell脚本 1、she…

王子公主来扫雷0^0

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;扫雷小游戏&#xff0c; 主厨&#xff1a;邪王真眼 所属专栏&#xff1a; C语言知识点 主厨的主页&#xff1a;Chef‘s blog 引言&a…

SpringFramework实战指南(五)

SpringFramework实战指南(五) 4.3 基于 注解 方式管理 Bean4.3.1 实验一: Bean注解标记和扫描 (IoC)4.3.2 实验二: 组件(Bean)作用域和周期方法注解4.3.3 实验三: Bean属性赋值:引用类型自动装配 (DI)4.3.4 实验四: Bean属性赋值:基本类型属性赋值 (DI)4.3.5 实验五:…

C语言第十六弹---操作符(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 操作符 1、下标访问[]、函数调用() 1.1、[ ] 下标引用操作符 1.2、函数调用操作符 2、结构成员访问操作符 2.1、结构体 2.1.1、结构的声明 2.1.2、结构体变…

Rust学习之Features

Rust学习之Features 一 什么是 Features二 默认 feature三 简单的features应用示例四 可选(optional)的依赖五 依赖的特性5.1 在依赖表中指定5.2 在features表中指定 六 命令行中特性控制七 特性统一路径八 其它8.1 相互排斥特性8.2 观察启用特性8.3 [Feature resolver version…

【Java程序设计】【C00234】基于Springboot的美食生活分享平台(有论文)

基于Springboot的美食生活分享平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的美食生活分享平台 主要功能如下&#xff1a;用户模块管理、美食分享笔记管理、美食笔记详情管理、公告信息管理、用户评论模块管…

node 第二十四天 mongoDB shell 命令 高级方法 $where aggregate聚合

$where 数据库数据如下 使用where语法如下 等价于 2.aggregate 聚合 使用聚合管道执行聚合操作。该管道允许用户通过一系列基于阶段的操作来处理来自集合或其他源的数据。 过滤数据, 分组数据 (排除name为 AAA 的数据 按price进行分组 每匹配一组计数1) 下面我们用aggregate…

three.js CSS3DRenderer、CSS3DSprite渲染HTML标签

有空的老铁关注一下我的抖音&#xff1a; 效果: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"></div><…