Shell内置与杂项-exit-clear / clear 🛠️ — 退出 Shell / 清屏

作用

exit 退出当前 Shell 并返回退出码给父进程;clear 清空终端屏幕内容。二者都是 Shell 内置或常用命令。

exit

1
exit [退出码]

终止当前 Shell 进程并返回退出码。exit 0 表示成功,exit 1(或非零)表示出错。不指定退出码时返回上一条命令的退出码。在脚本中用于提前终止或在错误时返回特定状态码。

clear

1
clear

清空终端屏幕(等效于 Ctrl+L 快捷键)。将屏幕内容上卷,终端提示符回到顶部。clear -x 保留滚动缓冲区。-T 终端类型 指定终端类型。

常用参数

参数 说明
-x(clear) 保留滚动缓冲区
-T 类型(clear) 指定终端类型

示例

1
2
3
4
5
exit                                # 退出当前 Shell(沿用上次退出码)
exit 0 # 成功退出
exit 1 # 失败退出
clear # 清屏
clear -x # 清屏(保留滚动缓冲区)

快捷键:Ctrl + L 等效于 clear


来源:菜鸟教程

Shell内置与杂项-printf 🛠️ — 格式化输出

作用

printf 根据格式化字符串输出文本,比 echo 功能更强。源自 C 语言的 printf 函数,支持格式说明符、宽度对齐、进制转换等,是 Shell 脚本中表格输出的首选工具。

语法

1
printf 格式 [参数...]

用法

printf 的格式字符串包含普通文本和格式说明符(以 % 开头)。常用说明符:%s 字符串、%d 整数、%f 浮点数、%x 十六进制。\n 换行、\t 制表符。宽度对齐:%10s 右对齐最小宽度 10,%-10s 左对齐。格式字符串会循环应用到所有参数。

常用参数

说明符 说明
%s 字符串
%d 整数
%f 浮点数
%x 十六进制
\n 换行
\t 制表符

示例

1
2
3
4
5
printf "HELLO %s\n" "WORLD"       # 格式化输出字符串
printf "%10s %-10s\n" "NAME" "VALUE" # 右对齐和左对齐
printf "%d\n" 255 # 输出十进制整数
printf "%x\n" 255 # 输出十六进制
printf "%f\n" 3.14 # 输出浮点数

来源:菜鸟教程

Shell内置与杂项-read 🛠️ — 从标准输入读取

作用

read 从标准输入(或文件描述符)读取一行内容并赋值给变量,是 Shell 脚本中获取用户输入和解析文本文件的核心命令。

语法

1
read [选项] 变量名...

用法

read 将输入行按 IFS(Internal Field Separator)分割后赋值给变量,多余的合并到最后一个变量。-p "提示" 显示提示信息;-s 静默模式(不回显,适合密码输入);-t 秒 设置超时;-n 字符数 精确读取 N 个字符后返回;-a 数组名 读取到数组;-d 分隔符 自定义分隔符;-r 原始模式(不处理转义字符)。

常用参数

参数 说明
-p "提示" 显示提示信息
-s 静默模式
-t 秒 超时时间
-n 数 读取字符数
-a 数组 读取到数组
-d 分隔符 自定义分隔符
-r 原始模式

示例

1
2
3
4
5
read -p "ENTER NAME: " NAME         # 带提示读取输入
read -s -p "PASSWORD: " PASS # 静默模式读取密码
read -t 5 -p "INPUT (5S): " DATA # 设置 5 秒超时
read -a ARR <<< "A B C" # 读取到数组
read -r LINE # 原始模式读取(不处理转义)

来源:菜鸟教程

Shell内置与杂项-set-unset / unset 🛠️ — Shell 选项与变量

作用

set 设置或取消 Shell 选项和位置参数,查看所有 Shell 变量。unset 删除变量或函数。两者都是 Shell 内置命令,用于控制 Shell 行为和变量管理。

set

1
set [选项] [参数...]

不加参数列出所有 Shell 变量和函数。常用选项:-eerrexit)出错立即退出脚本;-xxtrace)调试模式(显示每行命令);-unounset)使用未定义变量时报错;-o pipefail 管道中任一命令失败返回非零。用 + 关闭选项:set +e 关闭 -e

unset

1
unset [选项] 变量或函数

删除 Shell 变量或函数。-v 删除变量(默认);-f 删除函数。不可删除只读变量(readonly)。

常用参数

参数(set) 说明
-e 出错立即退出
-x 调试模式
-u 未定义变量报错
-o pipefail 管道失败检测

示例

1
2
3
4
5
set -ex                             # 启用调试模式 + 出错退出
set -u # 使用未定义变量时报错
set +e # 关闭出错退出
unset MY_VAR # 删除变量
unset -f MY_FUNCTION # 删除函数

来源:菜鸟教程

Shell内置与杂项-source 🛠️ — 在当前 Shell 中执行脚本

作用

source 在当前 Shell 环境中读取并执行脚本文件,不创建子进程。常用于重新加载配置文件(如 source ~/.bashrc)或导入函数库,修改的环境变量会保留在当前 Shell 中。

语法

1
source 文件名 [参数...]

用法

source 在当前 Shell 进程内执行文件,因此对变量的修改、函数的定义、别名设置等都会保留。等效于 .(点命令):. FILENAMEsource FILENAME 相同。常用于在 Shell 启动文件生效后立即应用更改。source 自身无特殊选项参数,仅接受文件名和参数。

常用参数

无(source 仅接受文件名和参数,自身无特殊选项)

示例

1
2
3
4
source ~/.bashrc                     # 重新加载 bash 配置
source /PATH/TO/SCRIPT.SH # 执行脚本(保留环境变量)
. ~/.profile # 点命令等效于 source
source FUNCTIONS.SH # 加载函数库

来源:菜鸟教程

Shell内置与杂项-test 🛠️ — 条件测试

作用

test 评估条件表达式并返回退出码(0 为真,1 为假),是 Shell 脚本条件判断的基础。常用于文件属性检查、字符串比较、数值比较。等效语法 [ 表达式 ](注意中括号两侧必须有空格)。

语法

1
2
test 表达式
[ 表达式 ]

用法

文件测试:-f 文件 是否存在且为普通文件;-d 目录 是否存在且为目录;-s 文件 是否存在且非空;-x 文件 是否可执行;-w 文件 是否可写;-N 文件 是否已修改。字符串测试:-z 字符串 长度为零;-n 字符串 长度非零。数值比较:-eq 相等、-ne 不等、-gt 大于、-lt 小于、-ge 大于等于、-le 小于等于。逻辑运算:! 非、-a 与、-o 或。

常用参数

参数 说明
-f 文件 是否为普通文件
-d 目录 是否为目录
-s 文件 是否非空
-x 文件 是否可执行
-z 字符串 字符串为空
-n 字符串 字符串非空
-eq 数值相等
-gt 数值大于
-lt 数值小于

示例

1
2
3
4
5
test -f /etc/passwd                  # 测试 /etc/passwd 是否为普通文件
[ -d /home ] && echo "DIR EXISTS" # 测试 /home 是否为目录
[ -z "$VAR" ] && echo "VAR IS EMPTY" # 测试变量是否为空
[ "$A" -eq "$B" ] && echo "EQUAL" # 数值相等比较
[ ! -f "/tmp/lock" ] && touch /tmp/lock # 取反测试(文件不存在则创建)

来源:菜鸟教程

Shell内置与杂项-true-false-sleep / false / sleep 🛠️ — 状态与暂停

作用

true 始终返回退出码 0(成功);false 始终返回退出码 1(失败);sleep 暂停执行指定时间。在 Shell 脚本中用于无限循环、条件占位、延时等待等场景。

true / false

1
2
true
false

true 常用于创建无限循环:while true; do ...; donefalse 常用于禁用某段代码:if false; then ...; fi。配合 || 使用:cmd || true 忽略命令失败。

sleep

1
sleep NUMBER[SUFFIX]...

暂停执行指定的时间长度。支持后缀:s 秒(默认)、m 分钟、h 小时、d 天。支持小数:sleep 0.5。可同时指定多个参数:sleep 1h 30m 10s。脚本中用于等待、限速、定时任务等。

示例

1
2
3
4
5
6
while true; do echo "RUNNING"; sleep 1; done  # 无限循环每秒输出
true # 返回退出码 0
false # 返回退出码 1
sleep 5 # 暂停 5 秒
sleep 0.1 # 暂停 0.1 秒
sleep 1h 30m # 暂停 1 小时 30 分钟

来源:菜鸟教程

Shell内置与杂项-type 🛠️ — 显示命令类型

作用

type 显示指定命令的类型(内置命令、外部程序、别名、函数或关键字),帮助理解 Shell 如何解析和执行命令。

语法

1
type [选项] 命令...

用法

type 比 which 提供更多信息。-a 显示所有匹配位置(别名、内置、PATH 中的外部程序);-p 仅显示外部命令路径(类似 which);-t 仅显示类型名称(简单文本输出);-W 显示类型(别名、关键字、函数、内置、文件)。

常用参数

参数 说明
-a 所有匹配位置
-p 仅外部命令路径
-t 仅类型名称
-W 显示类型

示例

1
2
3
4
5
type ls                             # 显示 ls 命令类型
type -a ls # 显示所有匹配位置
type -p ls # 仅显示外部命令路径
type -t cd # 仅显示类型名称
type -a echo # 显示 echo 所有匹配

来源:菜鸟教程

Shell内置与杂项-which-whereis / whereis 🛠️ — 查找命令位置

作用

which 从 PATH 环境变量中查找可执行命令的路径;whereis 查找命令的二进制文件、源代码和 man 手册的位置。用于定位命令所在目录、确认命令是否已安装。

which

1
which [选项] 命令...

在 PATH 中搜索命令路径。-a 显示所有匹配路径(而非仅第一个)。-s 静默模式(仅返回退出码)。适用于脚本中检测命令是否存在。

whereis

1
whereis [选项] 命令...

查找命令的二进制、源码和 man 手册位置。-b 仅查找二进制;-m 仅查找 man 手册;-s 仅查找源码。-u 显示缺少某类文件的条目(unusual entries)。比 which 显示更多信息。

常用参数

参数 说明
-a(which) 所有匹配路径
-s(which) 静默模式
-b(whereis) 仅二进制
-m(whereis) 仅 man 手册
-s(whereis) 仅源码
-u(whereis) 显示缺少某类文件的条目

示例

1
2
3
4
5
6
which python3                       # 查找 python3 命令路径
which -a ls # 显示所有匹配的 ls 路径
which -s python3 && echo "INSTALLED" # 静默检查命令是否存在
whereis ls # 查找 ls 的二进制和 man 手册
whereis -b python3 # 仅查找二进制文件位置
whereis -m ls # 仅查找 man 手册位置

来源:菜鸟教程

JSON 文档格式概述

JSON(JavaScript Object Notation)是一种轻量级的文本数据格式,设计目标是 简洁易读、跨语言通用。广泛用于前后端数据交互、API 接口、配置文件等场景。


📋 基础信息

项目 说明
文件扩展名 .json
标准版本 RFC 8259 / ECMA-404(当前标准)
核心哲学 轻量、语言无关、键值对驱动

🔤 语法规则

一条完整的 JSON

1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "张三",
"age": 25,
"is_student": false,
"hobbies": ["读书", "跑步"],
"address": {
"city": "北京",
"district": "海淀"
},
"score": 95.5,
"remark": null
}

六大铁律:

规则 说明
键名双引号 所有键名必须用 " 包裹,无引号或单引号均非法
字符串双引号 字符串值也必须用 " 包裹
禁止尾随逗号 最后一个元素后面不能有逗号
布尔值小写 只能用 true / false
空值用 null 只能用 null,不能用 undefined
不支持注释 原生 JSON 没有注释语法

🏗️ 数据结构

6 种数据类型

1
2
3
4
5
6
7
8
9
{
"string": "hello world",
"number": 42,
"float": 3.14,
"boolean": true,
"null_value": null,
"array": [1, 2, 3],
"object": { "key": "value" }
}
类型 说明 示例
字符串 双引号包裹的文本 "你好"
数字 整数和浮点数 423.14
布尔值 真 / 假 true / false
空值 空 / 无 null
数组 有序集合,方括号包裹 [1, "a", true]
对象 键值对集合,花括号包裹 {"k": "v"}

注意:JSON 不支持 undefinedFunctionDateNaN 等类型。

嵌套结构

对象嵌套对象

1
2
3
4
5
6
7
8
9
10
11
{
"user": {
"profile": {
"name": "张三",
"address": {
"city": "北京",
"street": "建国路"
}
}
}
}

对象嵌套数组

1
2
3
4
5
6
{
"students": [
{ "name": "小明", "score": 95 },
{ "name": "小红", "score": 88 }
]
}

多维数组

1
2
3
4
5
6
{
"matrix": [
[1, 2, 3],
[4, 5, 6]
]
}

建议:嵌套深度不超过 5 层,过深的结构难以阅读和维护。


📝 字符串转义

特殊字符需要用反斜杠转义:

写法 含义
\" 双引号
\\ 反斜杠
\n 换行
\t 制表符
\r 回车
\uXXXX Unicode 字符
1
2
3
{
"message": "他说:\"你好!\"\n欢迎来到北京。"
}

⚡ JSON 与 JavaScript 对象的区别

特性 JSON JavaScript 对象
键名引号 必须双引号 可省略 / 单引号 / 双引号
值类型 仅 6 种基础类型 支持函数、Date 等
注释 不支持 支持
尾随逗号 禁止 允许
本质 字符串(文本格式) 内存中的数据结构

✅ 编写规范与最佳实践

键名命名风格

1
2
3
4
5
6
{
"first_name": "张三",
"last_name": "李",
"is_active": true,
"max_count": 100
}
风格 推荐场景
snake_case Python 项目(推荐)
camelCase JavaScript / Java / REST API
避免 kebab-case 不方便作为对象属性访问

类型使用规范

1
2
3
4
5
# ❌ 错误:该用数字却用字符串
{ "count": "42", "active": "true" }

# ✅ 正确:使用原生类型
{ "count": 42, "active": true }

null 与缺失字段

1
2
3
4
5
# null:字段存在但值为空
{ "middle_name": null }

# 缺失:字段不存在
{}

布尔值命名

1
2
3
4
5
{
"is_vip": true,
"has_permission": false,
"enable_notification": true
}

结构组织原则

  1. 相关字段按逻辑分组排列,用空行分隔
  2. 控制嵌套深度 ≤ 3–4 层
  3. 扁平化优先,降低解析复杂度
  4. 数组内元素类型保持一致

📡 API 响应格式规范

统一响应结构

1
2
3
4
5
6
{
"code": 200,
"message": "success",
"data": {},
"timestamp": 1710000000000
}

分页格式

1
2
3
4
5
6
7
8
9
10
11
{
"data": [],
"pagination": {
"page": 1,
"per_page": 20,
"total": 150,
"total_pages": 8,
"has_next": true,
"has_prev": false
}
}

错误响应

1
2
3
4
5
6
7
8
{
"error": {
"code": "VALIDATION_ERROR",
"message": "邮箱格式不正确",
"field": "email",
"status": 422
}
}

⚠️ 常见错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ❌ 错误 1:键名没有双引号
{ name: "张三" }

# ❌ 错误 2:单引号包裹
{'name': '张三'}

# ❌ 错误 3:尾随逗号
{"a": 1, "b": 2,}

# ❌ 错误 4:布尔值大写
{"active": True}

# ❌ 错误 5:前导零
{"phone": 0123456}

# ❌ 错误 6:包含 undefined
{"value": undefined}

📐 JSON Schema 校验

JSON Schema 用于定义和验证 JSON 数据的结构规范:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"username": {
"type": "string",
"minLength": 3,
"maxLength": 20
},
"age": {
"type": "number",
"minimum": 0,
"maximum": 150
},
"email": {
"type": "string",
"format": "email"
}
},
"required": ["username", "age", "email"]
}

🛡️ 安全规范

项目 要求
JSON 注入 禁止手动拼接 JSON,使用官方序列化库
原型污染 过滤 __proto__ 等危险键名
超大 payload 限制解析深度和请求体大小
数字精度 超大整数(> 2⁵³)转为字符串传输

🔧 工具链

用途 工具
语法校验 JSONLint、AJV
格式化 Prettier、VSCode 原生格式化
命令行处理 jq(查询/过滤/转换)
类型生成 json2ts(TypeScript)、quicktype(多语言)
接口调试 Postman、Apifox

📌 速查卡(Golden Rules)

1
2
3
4
5
6
7
8
9
10
 1. ✅ 键名和字符串必须用双引号
2. ✅ 禁止尾随逗号
3. ✅ 布尔值用 true / false(小写)
4. ✅ 空值用 null
5. ✅ UTF-8 编码
6. ✅ 嵌套不超过 5 层
7. ✅ 键名风格全项目统一
8. ✅ 数组元素类型保持一致
9. ✅ 使用 JSON Schema 校验结构
10. ✅ 不手动拼接 JSON 字符串

总结:JSON 凭借简洁的语法和跨语言通用性,已成为当今最常见的数据交换格式。严格遵循双引号规则、统一命名风格、合理控制嵌套深度,是高效使用 JSON 的关键。

0%