news 2026/7/12 22:57:56

Shell 脚本语言(Bash/Sh)基础 与 应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Shell 脚本语言(Bash/Sh)基础 与 应用

目录

兼容性

概念

连接符

wait vs sleep

PID = Process ID:进程ID

echo ≈ print

#! vs #

cp vs rsync

cp -r 的“增量合并”指的只是:结构上的合并

rsync 的“增量传输”指的则是:数据块层面的省 IO

-n:模拟

diff:检验

合并参数:删除为例

目录

常用

举例

实时日志

未知环境运行脚本

1. 免疫“无执行权限”报错(最常见的原因)

2. 强行纠正“环境盲区”(防止用错解释器)

3. 忽略脚本第一行的路径报错

caddy

屏蔽报错:2>/dev/null

检查服务死活:curl -I url

替换

🔍 为什么这么写?(简短拆解)

🛡️ 安全稳妥版(推荐,带自动备份)

写入末尾:EOF

全目录搜索(隐藏)文件/目录:find-name "*.log"

环境参数、变量:多环境本地开发配置

终端:Gateway(网关)服务

/stop入栈网关:curl


兼容性

终端环境兼容性说明
Linux(bash/sh/zsh)✅ 完全适用标准 Shell 环境
macOS(zsh/bash)✅ 大部分适用部分命令参数略有差异(如sed -i需要备份后缀)
Windows (CMD)❌ 不适用使用完全不同的命令(dirvsls
Windows (PowerShell)⚠️ 部分适用支持lscat等别名,但底层机制不同
Windows (WSL/Git Bash)✅ 适用模拟 Linux 环境
Dockerfile⚠️ 有限适用RUN/CMD内可使用,且取决于基础镜像的 Shell
  1. Shell 命令语言(bash/sh)主要在Unix-like 系统(Linux、macOS、WSL)中通用

  2. Dockerfile是一种声明式配置语言,内部嵌套使用 Shell 命令

  3. 跨平台问题:写脚本时需要考虑目标环境(例如用python而不是python3这种差异)

如果想让 Shell 脚本在不同终端都适用,建议:使用 POSIX 标准语法(避免 bash 特有特性)

  • 或用Python等真正的跨平台语言

概念

man test查看完整文档(Linux/Mac)

连接符

符号名称执行条件 / 作用示例
顺序/逻辑控制
;或直接换行顺序执行符前者结束(无论成败)则执行后者cmd1 ; cmd2
&&逻辑与前者成功才执行后者make && make install
||逻辑或前者失败才执行后者make || echo "Failed"
后台/异步控制
&后台运行符前者后台运行,不等待立即执行后者server & client
数据流控制
|管道符前者的输出作为后者的输入cat log.txt | grep "error"
其他常用
#注释符其后的内容为注释,不执行# 这是注释
\换行转义符将下一行拼接为同一命令echo "hello \
world"

wait vs sleep

sleep time #等time秒
wait $PID # 等进程结束

PID = Process ID:进程ID

$$ # 当前 Shell 的 PID $! # 最后一个后台进程的 PID $? # 上一个命令的退出码(0=成功) ps aux | grep node # 可以看到所有进程名带node的 PID kill 12345 # 通过 PID 杀死进程 echo $! # 输出刚启动的进程 PID

echo≈ print

输出内容(默认到终端,类似console.logprint

echo "Hello World" # 输出: Hello World
echo "错误信息" >&2 # 输出到错误流
echo -n "不换行" # -n 参数不换行
echo $VAR # 输出变量值

#! vs #

  • 普通#开头的行 → 注释,完全忽略

  • 第一行的#!→ Shebang,告诉系统用哪个程序执行脚本

#!/usr/bin/env zsh #指定zsh执行

cp vs rsync

cp 直接覆盖,会占用大量的磁盘 I/O 吞吐量,全新复制或者一次性cp效率更高

rsync只传有变化的内容,需要额外安装,适合大量文件频繁更新

cp -r的“增量合并”指的只是:结构上的合并

rm -rf /root/.hermes/skills/mi-docs && \
cp -r /opt/hermes/built-in-skills/mi-docs /root/.hermes/skills/

当你执行cp -r sourcedir/ destdir/时,如果destdir已经存在:

  • 结构合并:如果源目录有A、B文件,目标目录有B、C文件。执行后,目标目录会变成A、B、C。那个原本就有的C不会被删掉。从目录结构和结果来看,这叫“合并”或“增量”。

  • 底层 IO(关键在这里!):对于那个同名的B文件,cp的底层绝对不是“增量传输”。不管B的内容有没有变,cp都会无脑地把源端的B重新读一遍,然后强行写过去、把旧的B完全覆盖掉。所以,它在数据传输上是全量覆盖,在目录结果上是同名覆盖、异名并存

rsync的“增量传输”指的则是:数据块层面的省 IO

同样是处理同名的B文件:

  • rsync会先看两边B的体积和时间(size+mtime)。

  • 如果一样,rsync连 1 个字节都不会读写,直接跳过!

  • 如果不一样,rsync才会去传那个变动的文件

rsync -a --delete "${SRC}/${dir}/" "${DEST}/${dir}/"

rsyncRemoteSync远程 / 本地文件同步)

--delete 会删掉目标区独有的文件,是rsync独有的参数

--checksum:算 MD5 / rolling checksum,再决定是否传输(更精确,但对大目录会慢很多,一般不加)。

-a代表Archive(归档模式)

它是一个“全能组合参数”(等价于-rlptgoD),作用是一键完美保留文件的所有原生属性

简而言之,加了-a,复制过去的文件会保持原样:

  • 不退化:递归复制所有子目录和文件。

  • 不变质:保留原文件的修改时间(mtime)、权限(rwx)。

  • 不失真:保留文件的所有者(owner)、所属组(group)以及软链接

它是rsync拷贝目录时最常用、最稳健的标配参数。

# 1. 是否安装了 rsync(推荐) command -v rsync && echo "已安装" || echo "未安装" # 2. 看路径 which rsync # 3. 看版本(能输出版本号就说明可用)【通用】 rsync --version | head -1
-n:模拟

测试不写盘:rsync -avn --delete ...(dry-run)

验证 --delete:在目标建源没有的文件,干跑应出现 deleting ...

  • -a(Archive / 归档):全能拷贝。一键完美保留文件的所有原生属性(递归、时间戳、权限等)。

  • -v(Verbose / 详细输出):话痨模式。让rsync把正在比对、传输、删除的每一个文件名和进度都清清楚楚地打印在屏幕上。

  • -n(Dry-Run / 空跑验证)核心免死金牌。告诉系统只做“模拟演习”,绝对不往磁盘写入任何数据,也不删除任何文件

diff:检验
diff -rq /opt/hermes/built-in-skills/mi-docs /root/.hermes/skills/mi-docs

它是用来快速肉眼验证两个文件夹是否已经完全 100% 对齐(镜像一致)的黄金命令。

其中的-rq是两个参数的组合,全称和中文示意如下:

1.-r——Recursive(递归比对)

  • 中文示意:不仅比对当前目录下的文件,还要钻进所有的子文件夹、孙子文件夹里,把里面所有的深层文件全部揪出来逐一进行跨时空比对。

2.-q——Quiet /Brief(静默 / 仅报告差异)

  • 中文示意:这是最关键的参数。普通的diff会把两个文件里哪一行代码不一样、哪一个字符有错全部密密麻麻地打印出来(刷屏)。而加上-q后,它会变得极其高冷,“只告诉你结果,不废话”

情况 A:两边完全一致(最完美的景象)

  • 现象:终端一片寂静,什么都没有输出(返回状态码为 0)。

  • 代表含义:恭喜你,/opt/root里的这两个技能目录文件一模一样,rsync --delete极其成功!

情况 B:目标区(WFS)多了源区没有的文件

  • 现象:终端会打印:Only in /root/.hermes/skills/mi-docs: ghost_file.js

  • 代表含义:目标区有孤儿文件,说明你的--delete没生效或者没跑。

情况 C:两边的同名文件内容被修改了

  • 现象:终端会打印:Files /opt/.../index.js and /root/.../index.js differ

  • 代表含义:这两个同名文件的内容不一样,代码被动过了。

合并参数:删除为例

rm 文件 # 删一个文件
rm -r 目录 # 递归删目录(里面所有东西)
rm -f 文件 # 强制删,不确认
rm -rf 目录 # 强制递归删,最常用的组合

-rrecursive递归,目录和里面所有内容都删
-fforce

强制,不提示确认,不存在也不报错

目录

写法含义什么时候用
~/xxx目录开始不管当前在哪都能找到
/xxx从根目录开始固定绝对路径
xxx./xxx从当前目录开始你已经cd进去了
  • /是根目录,整台机器的起点

  • /root是root用户的桌面,藏在根目录下面

  • root 是管理员账号,他的家恰好叫/root

/ ← 根目录,一切从这里开始
├── root/ ← root用户的家(~在root身份下就是这里)
├── home/
│ ├── work/ ← work用户的家(~在work身份下就是这里)
│ └── zhangsan/ ← zhangsan的家
├── opt/ ← 装软件的
├── tmp/ ← 临时文件
└── var/ ← 日志

路径英文标准全称一句话大白话定位你的项目影子
/optOptional第三方独立大项目安装区(代码、脚本堆放地)/opt/hermes/(镜像里的通用代码库)
/etcExtendedToolConfigurations(扩展工具配置)全局软件和系统的纯文本配置文件存放区/etc/caddy/caddy_config.json
/binBinaries(二进制文件)

系统和核心用户必用的基础命令(可执行程序)

编译好的、可以直接运行的程序

/bin/bash(强行调用的 Bash 解释器)
/usr/binUserSystemResourcesBin后续安装的第三方软件的命令/程序主入口/usr/bin/caddy(Caddy 的可执行二进制文件)
/rootRootHome超级管理员 root 用户的私人专属“家目录”/root/.hermes/(WFS 云盘挂载的个性化区)

df命令的英文全称是disk free查看系统磁盘空间,就像window查看C、D盘一样。

默认的单位是字节(KB),很难人类阅读。所以,在实际开发和运维中,100% 的人都会加上-h参数(human-readable)

Mounted on (挂载点):这个磁盘分区在 Linux 系统里对应的具体文件夹路径

Filesystem … Mounted on

wfsxxx /root/.openclaw

wfs 持久化,换ip也不会丢

常用

命令英文全称中文示意用法示例说明
catConcatenate连接/查看文件cat file.txt查看文件内容或合并多个文件
cdChange Directory切换目录cd /home/user进入指定目录
grepGlobal Regular Expression Print全局正则匹配打印grep "text" file.txt在文件中搜索匹配的文本模式
-An/-BnAfter/Before紧随前/后的 n 行(Context 上下文)grep -A5 'DIRS=' /opt/openclaw/sh/custom.sh匹配到关键词后,额外展示紧随前/后的 n 行
llLong Listing (alias)详细列表ll列出文件详细信息(权限、大小、时间等)
lsList Segments/List列出目录内容ls显示当前目录下的文件和文件夹
ll -alLong Listing - All Long显示所有详细列表

ll -a -l

列出所有文件(包括隐藏文件)的详细信息
pwdPrint Working Directory打印当前工作目录pwd显示当前所在的绝对路径
mkdirMake Directory创建目录mkdir a/b/c创建新目录,若目录已存在则报错
mkdir -pMake Directory -Parents递归创建目录mkdir -p a/b/c自动创建路径中所有缺失的父目录,若目录已存在则静默跳过
cpCopy复制文件cp file1.txt file2.txt复制文件,若目标已存在则覆盖(不询问)
cp -rCopy - Recursive递归复制目录cp -r sourcedir/ destdir/复制整个目录(包含所有子文件和子文件夹)。若目标同名文件夹已存在,采用“全量覆盖写入”:同名文件无脑重写覆盖,异名文件保留并存
~Tilde当前登录用户家目录cd ~代表当前用户的home目录,如/root,/home/用户名
>Redirect覆盖重定向echo "a" > file把输出写入文件,覆盖原内容
>>Append Redirect追加重定向echo "a" >> file把输出追加到文件末尾,不覆盖
echoEcho输出字符串echo "hello"打印到屏幕,配合重定向可写文件
which命令/可执行程序的安装目录which git,which nodewhich mis

举例

实时日志

tail -f /var/log/openclaw/out.log

tail (尾巴):Linux 的标准命令,默认用来查看一个文件的最后 10 行。

-f (Follow / 跟随)核心参数。让命令不要结束,而是变成阻塞监听状态

只想实时看带 ERROR(报错)的日志,可以用管道符把它组合起来:

tail -f /var/log/openclaw/out.log | grep --line-buffered ERROR

未知环境运行脚本

/bin/bash /opt/hermes/scripts/custom.sh

/bin/bash :显式指定用系统里的 Bash 解释器,来强行读取并执行后面的 custom.sh 脚本

运维防御性写法,它主要用来解决以下 3 个痛点:

1. 免疫“无执行权限”报错(最常见的原因)

在 Linux 中,一个脚本要想直接通过./custom.sh运行,它必须拥有可执行权限(x权限)

+x的英文全称是+ execute(加上执行权限)。

  • +:表示Add(添加 / 赋予)。

  • x:代表eXecute(执行 / 运行)。

  • 如果发布代码时忘记执行chmod +x custom.sh赋予可执行权限,直接运行就会报Permission denied(拒绝访问)错误。

  • 破局:如果前面加上了/bin/bash,系统会认为正在运行的程序是 Bash(Bash 本身绝对有权限)custom.sh只是作为“文本参数”喂给 Bash 读取。这样哪怕custom.sh没有任何执行权限,也能完美正常运行!

2. 强行纠正“环境盲区”(防止用错解释器)

有时候系统默认的sh并不是bash(例如在 Ubuntu/Debian 里,默认的shdash,功能非常阉割)。

  • 如果直接执行,或者有些容器环境在调用时图省事用了sh custom.sh,脚本里写的很多高级 Bash 语法(比如DIRS=("example")这种数组定义)就会在运行时疯狂报错崩溃。

  • 破局:前面死死写住/bin/bash,就是不给系统任何瞎猜的机会,必须、只能用最纯正的 Bash 去解析。

3. 忽略脚本第一行的路径报错

脚本第一行通常写着#!/usr/bin/env bash或者#!/bin/bash(俗称 释伴 / Shebang)。 如果这个脚本是从 Windows 上编辑过再传到 Linux 上的,它的换行符会变成\r\n。这会导致 Linux 在解析第一行时,误以为你想找一个叫bash\r的解释器,从而报错Command not found

  • 破局:前面加上/bin/bash后,系统会直接跳过并忽略脚本第一行的 Shebang 声明,直接从第二行正式代码开始执行,从而规避了这种隐蔽的换行符巨坑。

caddy

chmod 600:Linux 里最高级别的隐私保护权限锁之一,常用于私钥、密码文件

chmod +x /usr/bin/caddy chmod +x /etc/caddy/caddy.sh chmod 600 /etc/caddy/public.key
  • 6(4+2) = 拥有者(root):拥有读(4)+写(2)权限。

  • 第 1 个0= 所属用户组没有任何权限。同组同事打不开、看不了。

  • 第 2 个0= 系统其他路人没有任何权限

屏蔽报错:2>/dev/null

if判断ls命令的退出码

找到至少一个目录 → 退出码0then执行cp

没找到任何目录 → 退出码非0→ 跳过cp

if ls claw-docker/openclaw/skills/*/ 1>/dev/null 2>&1; then \ cp -r claw-docker/openclaw/skills/* /opt/openclaw/skills/; \ fi && \ 等价于 cp -r claw-docker/openclaw/skills/* /opt/openclaw/skills/ 2>/dev/null || true

fi是if的结束标志

1>/dev/null 2>&1的含义

一句话解释:把命令的所有输出(包括正常信息和错误信息)都扔进“黑洞”(/dev/null),屏幕上什么都不显示。


逐部分拆解

符号含义数字对应
1标准输出(stdout)正常的命令输出
2标准错误(stderr)错误提示
>/dev/null重定向到空设备(丢弃)-
&1引用标准输出的目标-

分步理解

1>/dev/null # 把标准输出(正常信息)丢进 /dev/null(屏幕看不到) 2>&1 # 把标准错误(错误信息)也重定向到标准输出的位置 # 而标准输出已经被丢进 /dev/null 了,所以错误也进了 /dev/null

最终效果:无论命令执行成功还是失败,屏幕上都干干净净

检查服务死活:curl -I url

-I HEAD 发送HTTP HEAD请求,只拿头部信息

替换

在 Linux 终端中,最标准、高效的命令是使用sed

你可以直接运行以下命令来完成原地修改(直接修改文件内容)

sed -i 's|https://openapi\.com|https://openapi.cn|g' .openclaw/openclaw.json

🔍 为什么这么写?(简短拆解)

  • -i:表示In-place(原地修改)。它会直接修改openclaw.json文件本身,而不是仅仅把结果打印在屏幕上。

  • s|旧内容|新内容|g:这是sed的替换语法。

    • 这里使用了竖线|作为分隔符(通常用/),这样可以避免和网址里的//以及/发生冲突,免去写一堆转义反斜杠的麻烦。

    • g(Global)代表全局替换,即如果一行里出现了多次,全部都会被改掉。

  • \.:在旧内容中,.(点)在正则表达式里代表任意字符,所以用\.转义了一下,确保只精准匹配点号本身。

🛡️ 安全稳妥版(推荐,带自动备份)

如果你担心改错或者想要留个后路,可以加上一个备份后缀(比如.bak)Bash

sed -i.bak 's|https://openapi\.com|https://openapi.cn|g' .openclaw/openclaw.json

运行后,它会修改原文件,同时在同目录下自动生成一个openclaw.json.bak的未修改备份,确认无误后你手动删掉备份即可。

写入末尾:EOF

source /root/.hermes/.env cat >> /opt/hermes/channels/mi/.env << EOF MI_ROBOT_ID=${MI_ROBOT_ID} MI_APP_ID=${MI_APP_ID} MI_SEC_KEY=${MI_SEC_KEY} EOF

这段代码的作用是“将环境变量写入配置文件”。它通过source读取系统变量,然后使用一种叫做EOF的技术,把这三个配置项精准地追加到mi插件的.env文件里。

# 设置环境变量,只在当前终端有效 export PROXY_MODE=socket # 验证 echo $PROXY_MODE # 输出 socket # 关掉终端重新打开 → 变量消失

1.source /root/.hermes/.env

  • source(也可以写成一个点.:是 Shell 的内置命令,意思是“加载并执行指定文件中的内容”。

  • 大白话/root/.hermes/.env这个文件里可能写着诸如ROBOT_ID=123456这样的环境变量。这一句的作用就是把这些变量真正加载到当前的 Linux 会话中,让后面的命令能够读取到它们。

2.cat >> /opt/hermes/channels/mi/.env << EOF

这行命令包含了三个核心部分:

  • cat:原本是查看文件的命令,但配合后面的符号,在这里变成了“接收输入并输出”。

  • >>(追加重定向):代表“把内容粘到文件的最末尾”。如果文件不存在它会创建

  • << EOF(Here Document 技术)标记开始

3. 什么是EOF

EOFEnd Of File(文件结束)的缩写。

它其实只是一个分界符(Marker)

在脚本里,它的作用就像是一对双引号,只不过双引号只能扩住“一行”字,而<< EOF ... EOF可以扩住“整整一大段、带换行的多行文字”。

全目录搜索(隐藏)文件/目录:find <path> -name "*.log"

1. 从当前目录开始,递归搜索所有.env文件(最常用)Bash

find . -name ".env"
  • .:代表从当前目录开始往下找。

  • -name ".env":精准匹配文件名。因为find命令默认就会搜索隐藏文件和隐藏文件夹,所以不需要额外加特殊参数。

2. 搜索整个系统(从根目录/开始全局搜索)

如果你想在整个容器或整台服务器里彻查,需要从/开始。因为有些目录普通用户无权访问,建议加上sudo或屏蔽报错信息:

# 写法 A:使用 sudo 权限(推荐) sudo find / -name ".env" # 写法 B:如果是普通用户,屏蔽掉无权限的报错提示(将错误定向到空设备) find / -name ".env" 2>/dev/null

3. 如果你想顺便看看.env文件的具体路径和详细属性

结合-ls参数,可以像ls -l一样列出文件的权限、大小、修改时间以及所属用户:Bash

find . -name ".env" -ls

💡 进阶:如果你想顺便搜索.env里面的内容

如果你不仅想找到.env文件,还想顺便看看里面有没有包含某个关键词(比如MI),可以配合grep这样写:

# 找到所有 .env 文件并搜索里面包含 "MI" 的行 find . -name ".env" -exec grep -H "MI" {} \;

⚡ 现代替代方案:使用fd工具(如果系统安装了的话)

如果你的系统里安装了现代化的高级搜索工具fd(通常比传统 find 快很多),由于它默认会忽略隐藏文件,你需要加上-H参数:

fd -H ".env"

在 Node.js 项目中,package.json里的"scripts"对象就是一个“快捷键映射表”。

{ "main": "index.js", "scripts": { "start": "node index.js", "setup": "node setup.js", "report": "node weeklyReport.js", "sync": "npm run setup && npm run start && npm run report" },

npm run start(简写为npm start)是一个快捷命令(别名)。npm 就会在后台执行真正的命令:node index.js(即运行项目根目录下的index.js文件)。

环境参数、变量:多环境本地开发配置

"scripts": { "dev:test": "cross-env BUILD_ENV=test NODE_OPTIONS=--openssl-legacy-provider webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", }
  • cross-env:这是一个跨平台的工具。因为 Windows 和 Mac/Linux 设置环境变量的语法不一样,用它能保证在所有电脑上都能成功设置后面的变量。

  • BUILD_ENV=test / sandbox / prod唯一的变量!运行在测试环境/沙箱环境/生产环境,调对应环境的后端接口 API。”

  • NODE_OPTIONS=--openssl-legacy-provider:这是一个兼容性补丁。说明你的项目较老(比如 Webpack 3/4),而你电脑的 Node.js 版本较新(Node 17+),不加这一句项目会直接报错崩掉。

  • webpack-dev-server --config ...:这是真正干活的启动命令。利用 Webpack 启动一个本地开发服务器(支持热更新,代码改了浏览器自动刷新)。

终端:Gateway(网关)服务

run.sh

.sh是 Shell 脚本(Shell Script)的标准文件扩展名。 不过需要说明的是,虽然后缀是.sh,但具体用什么 Shell 解释器执行,取决于脚本内部第一行(Shebang)。比如你这个脚本的第一行是:

#!/usr/bin/env zsh

这代表它实际上指定了用zsh来执行,而不是最古老的sh或常见的bash

#!/usr/bin/env zsh # Load nvm export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # 使用子 Shell 执行,确保执行完(或中断后)回到原目录 cd ../../ && nvm use 22 && PNPM_CONFIG_BLOCK_EXOTIC_SUBDEPS=false OPENCLAW_FORCE_BUILD=1 PROJECT_MOCK_AUTH=1 node scripts/run-node.mjs gateway

[]组合起来其实是一个判断命令(等同于test命令),如判断是否是目录/脚本

-d代表Directory(目录),

-s 代表Shell(脚本)

  1. 加载环境:寻找并加载 NVM(Node Version Manager),确保终端可以使用nvm命令。

  2. 切换目录:cd ../../让终端向上跳两级目录(去到项目的根目录)。

  3. 切换 Node 版本:nvm use 22自动把当前 Node.js 环境切换到大版本 22。

  4. 注入环境变量并运行:后面那一长串是大写字母的是环境变量,用来临时改变程序的行为,最后用node执行了核心脚本。

  • PNPM_CONFIG_BLOCK_EXOTIC_SUBDEPS=false:允许 pnpm 安装或使用一些非标准的依赖项。

  • OPENCLAW_FORCE_BUILD=1:强制重新编译/构建 OpenClaw(可能涉及一些 C++ 原生模块或前端资源)。

  • PROJECT_MOCK_AUTH=1:开启“PROJECT”服务的 Mock(模拟)身份验证,研发阶段不需要真的去走登录鉴权流程。

  • node scripts/run-node.mjs gateway:用 Node 运行run-node.mjs脚本,并传入参数gateway,正式把网关服务跑起来。

/stop入栈网关:curl

跨域是浏览器内核特有的安全保护机制,命令行数据传输工具curl不受 CORS限制

curl -s -X POST http://127.0.0.1:18789/api/v1/stop \

-H 'Content-Type: application/json' \

-d '{"sessionKey":"agent:main:meishi:channel:20230fc124e","reason":"security_block"}'

-s:静音模式(Silent)

关闭curl的标准错误输出(stderr)中的进度表和错误信息。

-X POST:指定请求方式(Request Method),默认GET

-H:Header

-d:Data

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/12 22:56:44

非对称加密和零知识证明在区块链中的工作原理

可以把它们看作是保障区块链安全的两把不同但互补的锁。 一、非对称加密:区块链的“身份证”与“指纹锁” 这是所有区块链的根基,它解决了“你是谁”和“这是否是你同意的”这两个根本问题。 1. 核心原理:一对密钥,两种用途 它不再像传统密码那样使用单一的密钥(对称加…

作者头像 李华
网站建设 2026/7/12 22:53:39

KeeAnywhere配置迁移指南:如何在多台设备间同步插件设置

KeeAnywhere配置迁移指南&#xff1a;如何在多台设备间同步插件设置 【免费下载链接】KeeAnywhere A cloud storage provider plugin for KeePass Password Safe 项目地址: https://gitcode.com/gh_mirrors/ke/KeeAnywhere KeeAnywhere是一款为KeePass密码管理器设计的云…

作者头像 李华
网站建设 2026/7/12 22:52:08

深入理解ComplimentaryGradientView的API:委托方法与属性全解析

深入理解ComplimentaryGradientView的API&#xff1a;委托方法与属性全解析 【免费下载链接】ComplimentaryGradientView Create complementary gradients generated from dominant and prominent colors in supplied image. Inspired by Grade.js 项目地址: https://gitcode…

作者头像 李华
网站建设 2026/7/12 22:49:52

PUBG地图黑客性能优化指南:提升数据读取效率

PUBG地图黑客性能优化指南&#xff1a;提升数据读取效率 【免费下载链接】PUBG-map-hack Map hack solution for PUBG 项目地址: https://gitcode.com/gh_mirrors/pu/PUBG-map-hack PUBG地图黑客是一款能够帮助玩家在游戏中获取地图数据的工具&#xff0c;其核心功能在于…

作者头像 李华
网站建设 2026/7/12 22:49:44

MySQL深度分页如何优化-元一软件

正文一. 题目说明请优化如下SQL语句&#xff0c;其中tb表的b列存在索引。SELECT * FROM tb WHERE tb.b 5 LIMIT 30000,5;前同事给出的答案如下。SELECT * FROM tb WHERE id IN (SELECT id FROM tb WHERE tb.b 5 LIMIT 30000,5);此时面试官进行了两个问题追加。优化方案的SQL语…

作者头像 李华