shell脚本基础5——常用命令写作技巧

news2024/11/16 1:40:59

文章目录

  • 一、grep命令
  • 二、sed命令
    • 2.1 选项参数
    • 2.2 常用命令
  • 三、AWK命令
    • 3.1 常用参数
    • 3.2 常用示例
  • 四、find与xargs
  • 五、date命令
  • 六、对话框
    • 6.1 消息框
    • 6.2 yes/no对话框
    • 6.3 表单输入框
    • 6.4 密码输入框
    • 6.5 菜单栏
    • 6.6 单选对话框
    • 6.7 多选对话框
    • 6.8 进度条
  • 七、常用写作技巧
    • 7.1 EOF写入
    • 7.2 定位脚本目录
    • 7.3 set参数
    • 7.4 wait命令
    • 7.5 docker类

一、grep命令

基本了解:

  • grep主要用于过滤文本数据。

grep匹配模式:

  • egrep支持扩展的正则表达式。
  • fgrep不需要转义,不支持正则
  • grep [options] regex [files] regex表示正则表达式
选项释义
-w不加-w,贪婪模式,只要有就显示
-o ‘pattern’仅显示匹配正则的字段
–color=auto以彩色方式显示关键字
-i忽略大小写
-v不匹配匹配的,反向选择
-l输出匹配的文件名
-L输出不匹配的文件名
-c输出匹配的数目(行数)
-n输出匹配行时在前面加上文件名及在其中的行数
-x匹配整行
-A nu输出匹配到的当前行及后nu行
-B nu输出匹配到的当前行及前nu行
-C nu输出匹配到的当前行及前后nu行
-E支持扩展的正则表达式
-F不支持正则表达式,即不需要转义
-h抑制文件名的输出
-s抑制类似找不到文件等错误信息
-a针对二进制文件使用

二、sed命令

基本了解:

  • SED工具用来对文本进行过滤与替换操作,特别是在用脚本处理配置文件。
  • sed的模式空间:sed通过文件或管道读取文件内容,并将读入的内容复制到缓冲区中的过程。默认情况下,sed并不直接修改源文件,而是直接在对缓冲区中的内容进行操作。除非用sed -i这个功能,才能直接修改原文件内容。

2.1 选项参数

选项释义示例
-n一般sed的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上。
但如果加上 -n 后,则只有sed 特殊处理的那一行(或者动作)才会被列出来。
常与参数p配合使用。
sed -n “s#a#t#gp” 1.txt
替换1.txt中所有a为t
-e直接在指令列模式上进行 sed 的动作编辑sed -e ‘s/999/777/g’ baimu.sh
-f直接将 sed 的动作写在一个文件内
-rsed 的动作支援的是延伸型正规表示法的语法(预设基础正规表示法语法)
-i直接修改读取的文件内容,而不是由屏幕输出sed -i ‘s/999/888/g’ baimu.sh

1.参数-e用法示例。
在这里插入图片描述
2.参数-i用法示例。
在这里插入图片描述
3.参数-n用法示例,配合p使用。
在这里插入图片描述

2.2 常用命令

sed常用命令语法:

  • sed 【选项参数】 ‘命令’ 【文件名】
命令释义
a\新增append ,a 后面可以接字串,而这些字串会新的在目前的下一行出现。
i\插入, i 后面可以接字串,而这些字串会新的在目前的上一行出现。
d删除,因为是删除,所以 d 后面通常不接任何
c\整行取代。
s\取代(查找并替换),通常这个 s 的动作可以搭配正规表示法
p打印(显示),亦即将某个选择的资料印出,通常与参数 sed -n一起

1.新增。在显示结果的第2行下添加内容000。

在这里插入图片描述
2.插入。在显示结果的第2行上添加内容88888。
在这里插入图片描述
3.删除。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.整行取代。

在这里插入图片描述
在这里插入图片描述
5.查找字符取代。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
5.去掉空白行。
在这里插入图片描述

6.多命令组合使用时,可以使用多个-e指定。
在这里插入图片描述

三、AWK命令

基本了解:

  • AWK工具:是一种处理结构数据并输出格式化结果的编程语言。
  • 通常被用来进行格式扫描和处理。通过扫描一个或多个文件中的行,查看是否匹配指定的正则表达式,并执行相关的操作。

awk的主要特性:

  1. Awk以记录(文件中的行)和字段(文件中的列)的方式来查看文本文件。
  2. 和其他编程语言一样,Awk 包含变量、条件和循环。
  3. Awk能够进行运算和字符串操作。
  4. Awk能够生成格式化的报表数据。
  5. Awk 读入一行,执行一次主输入循环。

awk语法:

  • awk ‘/search pattern1/ {Actions}’
  • awk ‘/查找匹配/ {动作}’ 输入文件名

3.1 常用参数

参数释义
-F指定默认输入字段分割符,当不使用-F时,默认以“空格”即\t作为分割符。
-V指定默认输入记录分割符,当不使用-F时,默认以“回车”即\n作为分割符。
print非格式化打印 只能打印字符串和变量。
字符串必须加引号,$0、$1等默认变量不能加引号,自定义的变量要加’ '单引号

1.使用-F指定\作为分隔符。
在这里插入图片描述
2.显示文件内容,并添加行号。

在这里插入图片描述

3.2 常用示例

1.显示所有内容。
在这里插入图片描述

2.显示第1列和第2列
在这里插入图片描述
3.带行号显示第1列和第2列
在这里插入图片描述
4.显示第1列和最后一列
在这里插入图片描述
5.显示第1行和第5行。
在这里插入图片描述
6.显示第1行到第5行。
在这里插入图片描述

四、find与xargs

  • 这两个命令常常搭配来用,可以查找并及时处理内容。

固定格式:

  • |xargs -I {} 命令 {}
  • {}代表上个命令返回的每个结果。

1.例1,查找/opt目录名称为setup.sh的文件,交给xargs处理,打印第2行到第4行的内容。
在这里插入图片描述

五、date命令

  • 需要对时间日期操作时,使用date。
  • 常用于数据压缩脚本,日志脚本。

1.读取当前年月日,time= `date +%Y%m%d`
在这里插入图片描述

2.以指定格式获取3个月以前的年月日,old_time=`date -d “$now 3 months ago” +%Y.%m.%d`

在这里插入图片描述
3.单独获取年月日,如下获取一天以前的日期,`date -d “$now 1 days ago” +%m%d`

在这里插入图片描述
4.脚本中也可以使用小括号引用变量,作用和单引号一样,time=$(date +%Y.%m.%d-%H.%M.%S)

在这里插入图片描述

六、对话框

  • 脚本中若是需要与用户交互,可以使用该对话框处理。比如安装服务时需要用户选择安装什么服务,此时可以考虑做个对话框出来供用户选择。
  • 实现对话框的工具有多种,比如dialog,zenity,它俩需要安装。这里讲whiptail的用法,,它是默认安装的。

6.1 消息框

语法:

  • whiptail --title “< message box title>” --msgbox “< text to show>” < height> < width>

参数释义:

  • 参数title:文本框的标头。
  • 参数msgbox:文本框中要显示的内容。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。

1.安装服务时,可以在脚本中设计这一行,让用户确认自己的选择。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
whiptail --title "请确认你要安装的微服务" --msgbox "qingjun" 10 60

2.执行脚本。

在这里插入图片描述

6.2 yes/no对话框

语法:

  • whiptail --title “< dialog box title>” --yesno “< text to show>” < height> < width>
  • 当选择左边选项的时候输出的是0,选择右边选项的时候输出的是1。

参数释义:

  • 参数title:文本框的标头。
  • 参数yesno:文本框中要显示的内容。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数–yes-button:选择yes的按钮显示。
  • 参数–no-button:选择no的按钮显示。

1.当有判断选择项时,可以选择安装,也可以选择不安装,此时可以使用yes/no对话框。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
if (whiptail --title "请选择Yes或No" --yesno "是否要安装qingjun服务." 10 60);then
    echo "你选择的是yes,即将安装"
else
    echo "你选择的是no,不安装"
fi

在这里插入图片描述

2.也可以自定义选择项。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
if (whiptail --title "请选择Yes或No" --yes-button "男" --no-button "女"  --yesno "你的性别是什么?" 10 60) then
    echo "You chose Man Exit status was $?."
else
    echo "You chose Woman. Exit status was $?."
fi

在这里插入图片描述

6.3 表单输入框

语法:

  • whiptail --title “< input box title>” --inputbox “< text to show>” < height> < width> < default-text>

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数inputbox:适用与用户交互,让用户输入内容。

1.当要安装集群服务时,可以使用表单输入框来实现。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
NAME=$(whiptail --title "服务安装" --inputbox "请输入要安装服务的服务器IP" 10 60  3>&1 1>&2 2>&3)
 
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "Your name is:" $NAME
else
    echo "You chose Cancel."
fi

2.执行脚本
在这里插入图片描述

6.4 密码输入框

语法:

  • whiptail --title “< password box title>” --passwordbox “< text to show>” < height> < width>

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数passwordbox:适用与用户交互,让用户输入密码。

1.当涉及到密码校验时,可以选择密码输入框。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
PASSWORD=$(whiptail --title "密码校验" --passwordbox "请输入密码:" 10 60 3>&1 1>&2 2>&3)
 
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "Your password is:" $PASSWORD
else
    echo "You chose Cancel."
fi

2.执行脚本
在这里插入图片描述

6.5 菜单栏

基本了解:

  • 提供一个单项选择的菜单栏。

语法:

  • whiptail --title “< menu title>” --menu “< text to show>” < height> < width> < menu height> [ < tag> < item> ] . . .

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数menu:适用与用户交互,供用户选择。

1.可以提供选择项,常用于总脚本,提供各个小脚本执行选择。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
OPTION=$(whiptail --title "服务安装" --menu "请选择要安装的微服务" 15 60 4 \
"第一步" "系统初始化" \
"第二步" "安装consul服务端" \
"第三步" "安装consul客户端"   3>&1 1>&2 2>&3)
 
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "Your favorite programming language is:" $OPTION
else
    echo "You chose Cancel."
fi

2.执行脚本。
在这里插入图片描述

6.6 单选对话框

基本了解:

  • 该对话框是单选对话框,可以控制默认的选择位置,即使你在脚本中默认选择多个,他也只会输出一个结果。

语法:

  • whiptail --title “< radiolist title>” --radiolist “< text to show>” < height> < width> < list height> [ < tag> < item> < status> ] . . .

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数radiolist:适用与用户交互,供用户选择,单选。在脚本中可以通过OFF/ON选择默认项。

1.可以根据安装服务类别来选择。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
DISTROS=$(whiptail --title "服务安装" --radiolist \
"单选,请选择你要安装的微服务" 15 60 4 \
"aaa" "服务1" OFF \
"bbb" "服务2" OFF \
"ccc" "服务3" OFF \
"ddd" "服务4" OFF 3>&1 1>&2 2>&3)
 
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "The chosen distro is:" $DISTROS
else
    echo "You chose Cancel."
fi

2.执行脚本,空格选择。
在这里插入图片描述

6.7 多选对话框

语法:

  • whiptail --title “< checklist title>” --checklist “< text to show>” < height> < width> < list height> [ < tag> < item> < status> ] . . .

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数checklist:适用与用户交互,供用户选择,多选。在脚本中可以通过OFF/ON选择默认项。

1.适用一次性安装多个服务。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
DISTROS=$(whiptail --title "服务安装" --checklist \
"多选,请选择要安装的服务:" 15 60 4 \
"aaa" "服务1" ON \
"bbb" "服务2" OFF \
"ccc" "服务3" ON \
"ddd" "服务4" OFF 3>&1 1>&2 2>&3)
 
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "Your favorite distros are:" $DISTROS
else
    echo "You chose Cancel."
fi

2.执行脚本。
在这里插入图片描述

6.8 进度条

语法:

  • whiptail --gauge “< test to show>” < height> < width> < inital percent>

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。

1.适用大服务脚本安装进度,不常用。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
{
    for ((i = 0 ; i <= 100 ; i+=1)); do
        sleep 1
        echo $i
    done
} | whiptail --gauge "Please wait while installing" 6 60 0

2.执行脚本。
在这里插入图片描述

七、常用写作技巧

7.1 EOF写入

  • 若需要在脚本中往指定文件里面写入内容,可以使用EOF一次性写入。

格式:

cat >文件名 <<EOF
文本内容
EOF

1.示例。

cat >docker-compose.yml <<EOF
version: '3'
services:
  ${app_container}:
    container_name: ${app_container}
    image: "reg.citms.cn:7443/public/${app_name}:${app_version}"
    hostname: "${app_container}"
    restart: always
    ports: 
      - "${app_ports[0]}:${app_ports[0]}" 
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data:/var/lib/mysql
      - ./config:/etc/mysql/conf.d
    environment: 
      - MYSQL_ROOT_PASSWORD=${app_password}
EOF

7.2 定位脚本目录

  • 写脚本时,需要确定脚本存放位置。
  • 比如脚本实际位置为/opt/test/qingjun.sh,此时不论是在/opt/test/目录下 sh qingjun.sh,还是在其他目录,如/tmp目录下sh /opt/test/qingjun.sh,都会打印出/opt/test

1.可以在脚本开头将脚本目录定义为变量,不管在那个目录执行脚本时都会寻找该目录,不会因为找不到脚本报错。

#!/bin/bash

scriptDir=$(cd $(dirname $0); pwd)
echo ${scriptDir};

7.3 set参数

  • 有几个参数很常用。

1.set -x:会在执行每一行shell脚本时,把执行的内容输出来,一般只用于调试使用。

set -x
command1
command2
set +x
command3

2.set -e:会在执行过程中,只要发生错误,脚本就终止执行,防止命令关联故障。

#中途也可以设置某些步骤即使报错也继续往下进行
set +e
command1
command2
set -e
command3

3.set +o history会临时消除history记录,用于隐藏敏感信息,常用于密码类

# 查看历史记录,会发现只有export YYY2=123,没有export YYY1=123
set +o history
export YYY1=123
set -o history
export YYY2=123

7.4 wait命令

  • wait命令配合&使用可以执行多条命令。
  • shell脚本中的任务通常是顺序执行,当需要同时执行多条命令时,可以采用wait命令。

1.通过 & 让进程后台执行,wait会等待shell中之前的进程结束

#!/bin/bash
mysleep() {
    echo "sleep $1 seconds"
    sleep "$1"
}
main() {
    for ((i = 1; i < 10; i++)); do
        (mysleep $i) &
    done
    wait
}
time main

在这里插入图片描述

7.5 docker类

  • 企业中,常用dokcer打包安装服务,所以在写计划任务时,需要注意计划任务执行时候没有TTY,否则计划任务日志会报错:the input device is not a TTY。
  • 比如计划任务中存在数据库数据备份脚本,那么该脚本中肯定会有docker exec -it myslq -u …这种命令,此时需要把-t参数去掉。
  • 计划任务的执行情况,通常查看 /var/spool/mail/root。

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

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

相关文章

我,ChatGPT,打钱

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 一、ChatGPT是个啥&#xff1f; chat&#xff1a;表示“聊天”。 GPT&#xff1a;则是G…

提升Python函数调用灵活性:参数传递类型详解

前言 在Python编程中&#xff0c;函数参数起着非常重要的作用。函数参数允许我们向函数传递数据&#xff0c;并在函数内部使用这些值。Python提供了多种参数传递类型&#xff0c;包括位置参数、关键字参数、默认参数、可变数量的位置参数、可变数量的关键字参数。这些不同的参数…

数据结构——串(字符串)

文章目录 **一 串的定义和实现****1 定义****2 串的存储结构****2.1 定长顺序存储表示****2.2 堆分配存储表示****2.3 块链存储表示** **3 串的基本操作** **二 串的模式匹配****1 简单的模式匹配算法****2 串的模式匹配算法——KMP算法****2.1 字符串的前缀&#xff0c;后缀和…

一起学SF框架系列5.4-模块Beans-DefaultListableBeanFactory

在生成ApplicationContext过程中&#xff0c;AbstractRefreshableApplicationContext.refreshBeanFactory()完成旧BeanFactory关闭&#xff0c;创建新的BeanFactory&#xff0c;即new DefaultListableBeanFactory(…)。然后bean实例化时调用本类的preInstantiateSingletons方法…

网安笔记12 IPsec

IPSec 基于通信IP环境下一种端到端&#xff0c;保证数据安全的机制 包含 两个安全协议&#xff0c;一个密钥管理协议&#xff0c; 标准价秘密技术为基础 DES/其他分组加密算法键值hash算法认证公钥有效的数字证书 AH协议提供信息源验证、完整性保证ESP提供信息源验证、机密…

华为OD机试真题 JavaScript 实现【求解立方根】【牛客练习题】

一、题目描述 计算一个浮点数的立方根&#xff0c;不使用库函数。保留一位小数。 数据范围&#xff1a;∣val∣≤20 。 二、输入描述 待求解参数&#xff0c;为double类型&#xff08;一个实数&#xff09; 三、输出描述 输出参数的立方根。保留一位小数。 四、解题思路…

Git工作流(随笔)

目录 前言 一、工作流概述 1、概念 2、分类 二、集中式工作流 1、概述 2、介绍 3、操作过程 三、功能分支工作流 1、概述 2、介绍 3、操作过程 1&#xff09;创建远程分支 2&#xff09;删除远程分支 四、GitFlow工作流 1、概述 2、介绍 3、操作过程 五、Forki…

Linux系统:CentOS编译Linux内核

目录 一、实验 1.下载内核 2.解压内核源码 3.配置依赖的环境 4.进入源码目录&#xff0c;使用make menuconfig开启菜单选项&#xff0c;手动选择内核功能 5.编译内核 6.安装模块 7.安装内核 8.验证新内核版本 一、实验 1.下载内核 &#xff08;1&#xff09;官网下载…

010:vue中el-table 隐藏表头的两种方法

第010个 查看专栏目录: VUE — element UI echarts&#xff0c;openlayers&#xff0c;cesium&#xff0c;leaflet&#xff0c;mapbox&#xff0c;d3&#xff0c;canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例…

【Kubernetes存储篇】StorageClass存储类动态生成PV详解

文章目录 一、StorageClass存储类理论二、案例&#xff1a;Storageclass存储类实战演示1、搭建NFS服务端2、搭建NFS供应商(provisioner)3、创建StorageClass存储类4、创建PVC&#xff0c;通过StorageClass动态生成PV5、创建Pod挂载PVC 三、步骤总结 一、StorageClass存储类理论…

web测试工程师的工作职责

web测试工程师的工作职责1 职责: 1、 负责数据平台产品的测试工作&#xff0c;参与产品需求分析&#xff0c;负责方案制定,并能预先评估项目风险&#xff0c;确保测试活动的顺利开展; 2、 深入理解系统内部的设计原理&#xff0c;并能从测试的角度提供优化意见; 3、 根据产品需…

LVS+Keepalived 高可用群集实战部署

目录 前言 一、Keepalived工具介绍 1、Keepalived的作用 2、 Keepalived体系主要模块 二、keepalived工作原理 1、VRRP &#xff08;虚拟路由冗余协议&#xff09; 2、VRRP &#xff08;虚拟路由冗余协议&#xff09; &#xff08;1&#xff09;keepalived.conf是主配置文…

qt 使用qtpdfium实现读取pdf文件

此处仅作为笔记和配置指导。 要想获取源码可Git hub上下载&#xff0c;这里推荐一个&#xff1a;QtPdfium_Build_Source: 基于Google pdfium 库&#xff0c;可编译和编译好的Qtpdfium 库&#xff0c;用于加载pdf文件进行预览 (gitee.com) 目前小编根据推荐的编译方法&#xf…

STM32F0实现数字化SPWM纯正弦波逆变器

一、理论基础 所谓SPWM&#xff0c;就是通过只有开关两个状态&#xff08;离散&#xff0c;数字的&#xff09;的PWM序列产生正弦波&#xff08;连续&#xff0c;模拟的&#xff09;的方法。其理论基础一句话就能说明白&#xff1a;冲量相等而形状不同的窄脉冲加在具有惯性的环…

golang语法的注意事项

目录 1.源文件以.go结尾2.过文件只能存在一个mian 函数 (入口函数)3. go严格区分大小写4. golang的每行代码是一个语句 默认存在 ; 不需要自己写了5. golang 是每一行每一行的执行的 不要把多个语句写在一行6. 定义变量 或是导入的包未使用 无法同过编译7. {} 都是成对出现 为了…

Xtrak 塔克小车巡线代码以及红绿灯识别相关小改动

做的小改动&#xff1a; 只更改了xtark_follow_line.py 增加了一次HSV分割来做红绿灯识别&#xff08;建议到时候用手机或者平板显示红色或者绿色图片&#xff09;&#xff0c;红绿图片&#xff1a; 将检测道路位置的方式从重心变为最接近屏幕中心的道路像素点。 检测不到道路之…

ubuntu 22.04部署dzzoffice及安装onlyoffice插件

目录 一、配置阿里源 二、安装数据库 三、安装依赖组件 &#xff08;一&#xff09;安装php7.4 &#xff08;二&#xff09;安装apache2 四、下载 dzzoffice 五、安装dzzoffice 六、安装onlyoffice插件 &#xff08;一&#xff09;从github下载小胡版onlyoffice替代原来…

如何学习及计算机编程,入门看这一篇就够了---以c语言为例

信息时代&#xff0c;计算机变成不再是专业性很强的一门学科&#xff0c;更多的是变成了一种工具 用计算机爬取信息&#xff08;爬虫&#xff09;进行数据分析&#xff0c;数据可视化&#xff08;大数据的某个方面&#xff09;处理海量的数据&#xff0c;如excel&#xff08;百…

声音生成项目(4)——从VariantAutoencoder(VAE)到VQ-VAE矢量量化变分编码器

文章目录 论文介绍步骤具体讲解自定义矢量量化层获取最近距离的码字的索引计算推导损失函数相关参考 矢量量化层的代码实现完整代码实现 论文介绍 不同于变分编码器和自动编码器&#xff0c;vq-vae中的latent space是离散的&#xff0c;并不是连续的&#xff0c;这能够避免后验…

第3章“程序的机器级表示”:理解指针

指针是 C 语言的一个重要特色。它们提供一种统一方式&#xff0c;能够远程访问数据结构。 指针基本的概念其实非常简单&#xff0c;下面的代码说明了许多这样的概念&#xff1a; struct str { /* Example Structure */int t;char v; };union uni { /* Example Union */int t;…