Shell 脚本进阶篇
Shell 是一种命令行解释器,它充当用户与操作系统内核之间的桥梁。用户在 Shell 中输入命令,Shell 负责解释这些命令并调用内核执行。
Shell 的主要功能包括:
- 命令解释:解释和执行用户命令,并传递给内核;
- 程序调用:支持调用其他程序并传递参数;
- 输入输出重定向:控制数据的流向;
- 管道连接:将一个程序的输出作为另一个程序的输入;
- 编程能力:支持变量、条件判断、循环等编程特性。
计算机中,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核。
由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。 在Linux下,这个命令行程序叫做 Shell。
文件与目录操作
ls:列出目录内容。cd:切换目录。pwd:显示当前目录路径。mkdir:创建目录。rmdir:删除空目录。rm:删除文件或目录。cp:复制文件或目录。mv:移动或重命名文件。touch:创建空文件或更新时间戳。cat:查看文件内容。stat:显示文件或文件系统的详细状态信息。less/more:分页查看大文件。head/tail:查看文件开头或结尾。ln:创建链接文件。basename / dirname:从路径中提取文件名和目录部分。
ls
列出当前目录里的文件、文件夹。
ls [选项] [文件或目录]
常用参数:
-l:以长格式显示详细信息(权限、链接数、所有者、大小、修改时间)。-a:显示所有文件,包括以点开头的隐藏文件。-h:与-l配合,以人类可读方式显示文件大小(如 KB、MB)。-R:递归显示子目录内容。-t:按修改时间排序(最新在上)。
ls -lahRt
ls -lh myshell.sh
cd
切换进入不同文件夹(改变当前所在位置)。
cd [目录路径]
无常用参数,支持特殊路径:
cd /:切换到系统的根目录。cd ~或cd:切换到当前用户的家目录。cd -:切换到上一次所在的目录。cd ..:切换到上级目录。
平台差异:Windows cmd, cd / 切换到当前盘符根目录,cd /D 可跨盘符。
cd /
cd ~
cd /Users/$USER/Documents
pwd
显示当前所在目录的绝对路径。
shell
pwd [选项]
常用参数:
-P:显示实际物理路径,不解析符号链接。-L:显示逻辑路径(包含符号链接,默认行为)。
平台差异:Windows cmd,无 pwd 命令,使用 echo %cd% 或 cd(无参数)。
pwd
pwd -P
mkdir
创建新目录。
mkdir [选项] 目录名...
常用参数:
-p:递归创建多级目录,若父目录不存在则自动创建。-m:创建时直接设置权限模式(如-m 755)。
mkdir -p project/src/main
mkdir -m 700 privateDir
rmdir
删除空目录。
rmdir [选项] 目录名...
常用参数:
-p:递归删除空目录,若删除后父目录也为空则一并删除。
注意:rmdir 只能删除空目录。删除非空目录请使用 rm -rf(Linux/macOS)或 rmdir /s(Windows cmd)。
rmdir -p project/src/main
rm
删除文件或目录。
rm [选项] 文件或目录...
常用参数:
-r或-R:递归删除,用于删除目录及其内容。-f:强制删除,忽略不存在的文件,不提示确认。-i:交互模式,删除前逐一询问确认。-v:显示详细删除过程。
平台差异:
- Windows cmd:使用
del删除文件,rmdir /s删除目录。
rm -rf project
rm -i log.txt
rm -v info.txt
cp
复制文件或目录。
cp [选项] 源文件 目标文件
cp [选项] 源文件... 目标目录
常用参数:
-r或-R:递归复制目录。-i:覆盖前提示确认。-u:仅当源文件比目标新或目标不存在时才复制。-p:保留原文件的属性(修改时间、权限等)。-a:归档模式,等于-dpR,保留链接、属性并递归。-v:显示详细复制过程。
cp file.txt log.txt
cp -r project project2
cp -rv project project3
cp -i project/src/main/log.txt log.txt
cp -a project project4
mv
移动或重命名文件。
mv [选项] 源文件 目标文件
mv [选项] 源文件... 目标目录
常用参数:
-i:覆盖前提示确认。-v:显示详细移动过程。-n:不覆盖已存在的目标文件。
平台差异:Windows cmd:使用 move。
mv project/src/main/log.txt log2.txt
mv -i project/src/main/log.txt log3.txt
mv -v project/src/main/log.txt log2.txt
mv -n project/src/main/log.txt log2.txt
mv -nv project/src/main/log.txt log2.txt
touch
创建空文件或更新文件时间戳。
touch [选项] 文件名...
常用参数:
-c:不创建任何文件,仅当文件存在时才修改时间戳。-t:指定时间戳(格式[[CC]YY]MMDDhhmm[.ss])。-r:参考另一个文件的时间戳来设置。-a:只改访问时间。-m:只改修改时间。
时间格式规则:
CC:世纪(19/20,可省略)YY:年份后两位MM:月份 01~12DD:日期 01~31hh:小时 00~23mm:分钟 00~59.ss:秒数 00~59,可选
平台差异:Windows cmd 无原生 touch 命令,可使用 copy nul filename 创建空文件。
touch log5.txt
touch log.txt
touch -t 202603021008.55 log.txt
touch -r err.txt log.txt
注意:修改创建时间,SetFile -d "02/02/2026 10:30:00" log.txt。
cat
查看文件内容(一次性输出整个文件)。
cat [选项] [文件...]
常用参数:
-n:对所有输出行编号。-b:仅对非空行编号。-s:压缩连续的空行为一行。
平台差异:Windows cmd 使用 type 命令。
cat log.txt
cat -n log.txt
cat -b vite.config.js
cat -s vite.config.js
stat
显示文件或文件系统的详细状态信息。
stat [选项] 文件...
常用参数:
-f 格式:自定义输出格式。-x:以扩展格式显示详细信息。-s:以 shell 可解析的格式输出。-l:显示链接信息。
格式占位符:
%z:文件大小(字节)。%Sm:最后修改时间。%Sa:最后访问时间。%B:块大小。
stat log.txt
stat -x log.txt
stat -f "%z bytes" log.txt
less / more
分页查看大文件(逐屏显示,支持上下滚动)。
less [选项] 文件名
more [选项] 文件名
less 常用参数:
-N:显示行号。-S:不换行,长行可左右滚动。-F:若文件内容少于一屏则直接退出(类似cat)。
more 常用参数:
-d:提示按空格继续、按 q 退出。-s:压缩连续空行为一行。
交互操作:
less:空格 /f下一页,b上一页,/关键词搜索,n下一个匹配,q退出。more:空格下一页,b上一页,q退出。
平台差异:Windows cmd 无原生 less,more 功能较简陋。
less vite.config.js
less -N vite.config.js
less -S vite.config.js
less -F vite.config.js
more vite.config.js
more -d vite.config.js
more -s vite.config.js
一句话:more 是基础版分页查看,less 是增强版(功能更强)。
head / tail
查看文件开头或结尾部分。
head [选项] 文件名
tail [选项] 文件名
head 常用参数:
-n [数量]:显示前 N 行(-n 20或简写-20)。-c [字节数]:显示前 N 个字节。
tail 常用参数:
-n [数量]:显示后 N 行(-n 20或简写-20)。-c [字节数]:显示后 N 个字节。-f:动态跟踪文件增长(常用于查看实时日志)。-F:类似-f,但文件被轮转后能重新打开。--pid=PID:与-f配合,当指定进程结束后也停止跟踪。
平台差异:Windows cmd 无原生 head/tail,可用 more 或 find 模拟部分功能。
head vite.config.js
head -n 20 vite.config.js
head -20 vite.config.js
head -c 100 vite.config.js
tail vite.config.js
tail -n 20 vite.config.js
tail -20 vite.config.js
tail -c 100 vite.config.js
tail -f vite.config.js
tail -F vite.config.js
ln
创建链接文件(硬链接或符号链接)。
ln [选项] 目标文件 链接名
常用参数:
-s:创建符号链接(软链接),不使用时创建硬链接。-f:强制覆盖已存在的链接文件。-n:若链接名是一个指向目录的符号链接,将其视为普通文件处理。-v:显示详细过程。
概念区别:
- 硬链接:与源文件指向同一 inode,删除源文件不影响硬链接,不能跨文件系统,不能链接目录。
- 符号链接:独立文件,存储源文件路径,删除源文件则链接失效(悬空链接),可跨文件系统,可链接目录。
平台差异:Windows cmd mklink 命令(需管理员权限),mklink /D 创建目录符号链接,mklink /H 硬链接。
ln log.txt log-link
ln -s log.txt log-link
ln -f log.txt log-link
ln -fv log.txt log-link
basename / dirname
从路径中提取文件名和目录部分。
basename /Users/$USER/Documents
basename /Users/$USER/Documents/log.txt .txt
dirname /Users/$USER/Documents
文件查找与内容处理
find:按条件查找文件。grep:搜索文件内容。sed:流式编辑文本。sort:排序文本行。uniq:去重相邻行(常与sort结合使用)。wc:统计行数、单词数、字节数。cut:按列切分文本。
find
在指定目录下按条件查找文件或目录。
find [路径...] [表达式]
常用参数(表达式部分):
-name 模式:按文件名查找(支持通配符*?,需加引号)。-iname 模式:忽略大小写的文件名匹配。-type 类型:按类型(f普通文件,d目录,l符号链接)。-size [+-]大小:按大小(c字节,kKB,MMB,GGB)。-mtime [+-]n:按修改时间(+n表示 n 天前,-n表示 n 天内)。-exec 命令 {} \;:对找到的每个文件执行命令。-exec 命令 {} +:与-exec类似,但将多个文件一次性传给命令(效率更高)。-delete:删除找到的文件。-print:打印结果(默认行为)。
平台差异:Windows cmd 无原生 find,有 where 命令(仅按文件名)。
find .
find . -name vite
find . -name src -type d
find . -name "*.vue" -size +20k
find . -name "*.md" -mtime -1
find . -name "*.md" -mtime -1 -exec ls -l {} \;
find . -name "*.md" -mtime -1 -exec ls -l {} +
grep
grep 是全局正则表达式打印(Global Regular Expression Print),用于搜索文件内容中的匹配模式(支持正则表达式)。
grep [选项] 模式 [文件...]
常用参数:
-i:忽略大小写。-r或-R:递归搜索目录下的所有文件。-n:显示匹配行的行号。-v:反向选择,输出不匹配的行。-l:只输出包含匹配内容的文件名。-L:只输出不包含匹配内容的文件名。-E:使用扩展正则表达式(等价于egrep)。-A n:显示匹配行及其后 n 行(After)。-B n:显示匹配行及其前 n 行(Before)。-C n:显示匹配行及其前后各 n 行(Context)。-o: 只输出匹配到的内容,不输出整行。-w:精确匹配完整单词,不匹配片段。-x:整行完全匹配。-c:只统计匹配行数,不展示内容。-q:静默匹配,只看是否命中,无输出(脚本判断用)。-s:忽略不存在文件、权限报错等错误信息。-F当作纯字符串匹配,禁用正则(等价 fgrep)。--color:匹配内容高亮显示。--exclude=xxx:排除指定文件。--exclude-dir=xxx:排除指定目录。
平台差异:Windows cmd 使用 findstr(功能较弱)。
grep "echarts" ./*
grep -n "echarts" ./*
grep -r "echarts" .
grep -rl "echarts" .
grep -rl "echarts" src/pages src/common
grep -rc "echarts" src/pages
grep -rl "echarts" . --exclude-dir=node_modules
grep -r -E "^(.+)_LOCALHOST_ENV" --exclude-dir=node_modules
grep -r -C 10 "echarts" .
sed
流编辑器 是流编辑器(Stream Editor),常用于查找替换。
sed [选项] '命令' 文件...
常用参数:
-i:直接修改文件(不加-i只输出到屏幕)。-i.bak:直接修改,同时备份为.bak文件。-e:执行多个命令。-n:安静模式,仅输出被处理的行(常与p命令配合)。
常用命令:
s/old/new/:替换每行第一个old为new。s/old/new/g:替换每行所有old为new(global)。s/old/new/2:替换每行第二个old。a:匹配行下方追加内容。i:匹配行上方插入内容。d:删除行。p:打印行(常与-n配合)。nq:处理到第 n 行后退出。
sed "s/原文/修改/" log.txt
sed "s/原文/修改/g" log.txt
sed "s/原文/修改/2" log.txt
sed -i "" "s/原文/修改/" log.txt # -i 后面必须传一个空字符串
sed '2d' log.txt # 删除第二行
sed '2,5d' log.txt # 删除2-5行
sed '/信息/d' log.txt # 删除含字符『信息』行
sed -n '2p' log.txt # 只打印第二行
sed -n '/信息/p' log.txt # 只打印含字符『信息』行
sed '3q' test.txt # 读到第三行,退出
sort
对文本行进行排序。
sort [选项] [文件...]
常用参数:
-n:按数值大小排序(默认按字典序)。-r:反向排序(降序)。-k 字段:按指定字段排序(如-k 2按第二字段)。-t 分隔符:指定字段分隔符(默认空白)。-u:去重(等同于先 sort 再 uniq)。-h:按人类可读数值排序(如 2K, 1M, 3G)。-o 文件:将结果写入文件(而不是重定向)。
sort log.txt
sort -r log.txt
sort -r -k 2 log.txt
sort -u log.txt
uniq
去重相邻行(通常与 sort 结合使用)。
uniq [选项] [输入文件 [输出文件]]
常用参数:
-c:在每行前显示重复次数。-d:仅显示重复的行(每个重复组显示一次)。-u:仅显示不重复的行(全局唯一)。-i:忽略大小写。-f N:跳过前 N 个字段进行比较。-s N:跳过前 N 个字符进行比较。
注意:uniq 只去除相邻重复行,因此通常需要先 sort。
sort log.txt | uniq -c
sort log.txt | uniq -d
sort log.txt | uniq -u
wc
统计行数、单词数、字节数。
wc [选项] [文件...]
常用参数:
-l:统计行数。-w:统计单词数。统计中文 = 被【空格 / 换行】分割的片段数量 + 空白符(空格、换行、制表符)。-c:统计字节数。-m:统计字符数(与-c在多字节编码下不同)。-L:显示最长行的长度。
平台差异:Windows cmd:无原生 wc。
wc -l log.txt
wc -w log.txt
wc -c log.txt
wc -m log.txt
wc -L log.txt
cut
按列切分文本,提取指定字段或字符。
cut [选项] [文件...]
常用参数:
-d 分隔符:指定字段分隔符(默认制表符\t)。-f 字段列表:指定要提取的字段(配合-d用)。-c 字符列表:按字符位置提取(如1-5,2,4)。-b:按字节截取(一般不用)。
cut -d : -f 1,2 log.txt
cut -c 3- log.txt
cut -c 1,2 log.txt
权限与进程管理
chmod:修改文件权限。chown:修改文件所有者。ps:查看进程状态。top:动态查看系统资源占用。kill:终止进程。sudo:以超级用户权限执行命令。lsof:列出打开的文件(含网络连接、端口占用等)。
chmod
chmod(change mode) 修改文件或目录的权限。
chmod [选项] 模式 文件...
-rw-r--r--@ 1 lizhao staff 61 5 20 12:59 log.txt
# -rw-r--r--:-表示代表这是普通文件;rw-表示文件所有者的权限;r--表示同组用户的权限;r--表示其他所有用户的权限
# staff:macOS 系统默认的用户组
常用参数:
-R:递归修改目录及其内部所有文件。-v:显示详细修改过程。
符号模式:[ugoa][+-=][rwxXst]
u:所有者(user)g:所属组(group)o:其他用户(others)a:全部(all,等同于 ugo)+:添加权限-:移除权限=:精确设置权限r:读权限w:写权限x:执行权限X:目录或已有执行权限的文件才添加执行权限
数字模式:三位八进制数
- 第一位:所有者权限
- 第二位:所属组权限
- 第三位:其他用户权限
- 权限值:
r=4,w=2,x=1(如7=rwx,5=r-x)
平台差异:传统 Windows 文件系统(FAT32/NTFS)不使用 Unix 权限模型。Git Bash/WSL 中可正常使用。
chmod +x myshell.sh # 加执行权限
chmod 755 myshell.sh # 所有都加权限 rwx;所属组加权限 r-x;其他用户权限 r-x
chmod -R g+w dir/ # 给所属组添加写权限
chmod a-x myshell.sh # 除所有人的执行权限
chown
chown(change owner)修改文件 / 目录所有者。
chown [选项] [用户][:组] 文件...
常用参数:
-R:递归修改目录及其内部所有文件。-v:显示详细修改过程。
格式说明:
chown user file:仅修改所有者。chown :group file:仅修改所属组。chown user:group file:同时修改所有者和组。chown user: file:修改所有者和组(组为用户的主组)。
平台差异:Windows 的 Git Bash/WSL 中可正常使用(需在 Linux 文件系统中)。
chown lizhao log.txt
chown :zhao log.txt
chown lizhao: log.txt
chown lizhao:zhao log.txt
chown lizhao:zhao *.txt
chown -R lizhao log
ps
显示当前系统中的进程信息。
ps [选项]
常用参数 BSD 风格(推荐):
a:显示所有终端的进程(包括其他用户)。u:显示面向用户的格式(用户、CPU、内存等)。x:显示没有控制终端的进程(如守护进程)。aux:最常用组合,显示所有用户的所有进程。
ps aux
ps aux | head -3
ps aux | grep zsh
常用参数 System V 风格:
-e或-A:所有进程。-f:完整格式(PPID、UID、时间等)。-ef:常用组合,显示所有进程的完整格式。-l:长格式。-u 用户名:显示指定用户的进程。-p PID:显示指定 PID 的进程。-o:指定要显示的列。比如:pid,ppid,cmd,%cpu,%mem,表示进程号、父进程号、命令、CPU占比、内存占比。
ps -ef
ps -el
ps -u $USER
ps -p 37009
ps -eo pid,ppid,cmd,%cpu,%mem
top
动态实时查看系统资源占用和进程状态。
top [选项]
htop [选项]
top 常用参数(macOS):
-s 秒数:设置界面刷新间隔。-pid PID:仅监控指定进程。-o 排序字段:按字段排序,-字段降序。-l 次数:输出指定轮次后退出(替代 - n)。-stats 列名:自定义展示列。
top -s 2 -pid 18268
top -s 2 -l 3 -pid 18268
kill
向进程发送信号(常用于终止进程)。
kill [选项] PID...
常用参数:
-l或-L:列出所有信号名称。-9或-KILL:强制终止(进程不可捕获,无法清理)。-15或-TERM:默认信号,正常终止(进程可捕获,允许清理)。-2或-INT:中断信号,相当于 Ctrl+C。-1或-HUP:挂起信号(常用于重新加载配置,如 nginx、systemd 服务。不用需要恢复)。-STOP:暂停进程(不是终止)。-CONT:恢复被暂停的进程。
平台差异:Windows 使用 taskkill /PID 1234 /F。
kill -l
kill -9 18268
kill -2 81423
kill -KILL 18268
kill -HUP 82812
kill -STOP 82812
kill -CONT 82812
# 清除占用端口的进程
kill -9 $(lsof -ti :9600)
sudo
sudo(Super User Do)以超级用户或其他用户身份执行命令。
sudo [选项] 命令
常用参数:
-u 用户:以指定用户身份执行(默认 root)。-i:模拟初始登录,加载目标用户的完整环境。-s:仅启动目标用户的 shell(不加载完整环境)。-k:清空缓存密码,下次 sudo 必须重输。-K:彻底删除 sudo 身份凭证。-l或--list:列出当前用户允许执行的命令。-b:在后台运行命令。-E:保留当前用户的环境变量。-H:将$HOME设置为目标用户的家目录。
平台差异:Windows:无原生 sudo,PowerShell 中可以右键“以管理员身份运行”,或使用 Start-Process -Verb RunAs。Windows 11 2024 更新后开始引入类似 sudo 的功能。
sudo -u nginx
sudo -i
sudo -l
sudo -s
sudo -E env
lsof
lsof(List Open Files)列出当前系统打开的文件(在 macOS/Linux 中一切皆文件,包括普通文件、目录、网络连接、设备等)。
lsof [选项] [名称...]
常用参数:
-i:显示网络连接(Internet 地址)。-i :端口号:显示指定端口的网络连接。-i TCP或-i UDP:仅显示 TCP 或 UDP 连接。-p PID:显示指定进程 ID 打开的文件。-u 用户名:显示指定用户打开的文件。-c 进程名:显示指定进程名打开的文件。-t:仅输出 PID(适合脚本使用)。-n:不解析主机名(显示 IP 地址,速度更快)。-P:不解析端口名(显示端口号,不转换为服务名)。-i4/-i6:仅显示 IPv4 或 IPv6 连接。+d 目录:列出目录下打开的文件(不递归)。-D 目录:递归列出目录下打开的文件(macOS 支持)。
lsof -i
lsof -i :9600
lsof -i tcp
lsof -p 90276
lsof -p 90276
lsof -c node
lsof -t -i :9600
lsof /Users/$USER/Documents
压缩与打包
tar:打包或解包文件(常用-czf压缩,-xzf解压)。gzip/gunzip:压缩或解压.gz文件。zip/unzip:处理.zip压缩包。
tar
打包或解包文件(常与压缩结合使用)。
tar [选项] 归档文件 [文件或目录...]
基本操作参数:
-c:创建归档文件。-x:解包归档文件。-t:列出归档内容。
压缩类型参数:
-z:通过 gzip 压缩/解压(.tar.gz或.tgz)。-j:通过 bzip2 压缩/解压(.tar.bz2或.tbz2)。-J:通过 xz 压缩/解压(.tar.xz)。
其他常用参数:
-f:指定归档文件名(必须紧跟参数,如-f archive.tar)。-v:显示处理的文件列表。-C 目录:解包时切换到指定目录。-p:保留原文件权限。-r:向已存在的归档文件中追加文件(不能用于压缩文件)。
平台差异:Windows 原生不支持 tar,但 Windows 10 1803+ 开始内置 tar 命令(功能有限)。
# 只打包,不压缩
tar -cvf log.tar f1.txt f2.f3 dir1
# 创建压缩包
tar -czvf log.tar.gz log.txt
tar -cjvf log.tar.bz2 log.txt
# 解压
tar -xzvf log.tar.gz
tar -zxvf log.tar.gz -C $(pwd)/temp
mkdir -p temp && tar -zxvf log.tar.gz -C $(pwd)/temp
# 查看
tar -tzvf log.tar.gz
gzip / gunzip
压缩或解压文件(只压缩单个文件,不打包目录)。
gzip [选项] 文件...
gunzip [选项] 文件.gz...
gzip 常用参数:
-d:解压缩(等同于gunzip)。-c:将结果输出到标准输出(保留原文件)。-r:递归压缩目录内文件。-1至-9:压缩级别(1 最快、体积最大,9 最慢、体积最小,默认 6)。-l:显示压缩文件信息。-k:保留原文件(默认 gzip 会删除原文件)。
gunzip 常用参数:
-c:将解压结果输出到标准输出(保留压缩包)。-f:强制解压(覆盖已存在的文件)。-k:保留压缩包(解压后不删除 .gz 文件)。
平台差异:Windows:原生不支持,Git Bash/WSL 中可用。
gzip -k log.txt
gzip -c log.txt > log.txt.gz
gzip -9 log.txt
gzip -l log.txt.gz
gzip -d log.txt.gz
gunzip log.txt.gz
gunzip -c log.txt.gz > log.txt
zip / unzip
处理 .zip 格式的压缩包(跨平台兼容性好)。
zip [选项] 压缩包名 文件...
unzip [选项] 压缩包名
zip 常用参数:
-r:递归压缩目录。-m:压缩后删除原文件。-e:加密(会提示输入密码)。-数字:压缩级别(0-9,0 仅存储不压缩)。-q:安静模式(不输出信息)。-u:更新压缩包中的文件(仅当文件更新时)。-d:从压缩包中删除文件。
unzip 常用参数:
-d 目录:解压到指定目录。-l:列出压缩包内容(不解压)。-o:覆盖已存在文件时不提示。-n:不覆盖已存在的文件。-p:将内容输出到标准输出(用于管道)。-q:安静模式。
zip log.zip log.txt
zip -r project.zip project
unzip log.zip
unzip -l log.zip
网络操作
ping:测试网络连通性。curl:发送 HTTP 请求。wget:下载文件。ssh:远程登录。scp:远程复制文件。netstat:查看网络状态。ifconfig/ip:查看网络接口配置。
ping
ping 是互联网数据包探查器(Packet Internet Groper),测试网络连通性和延迟。
ping [选项] 目标地址
常用参数:
-c 次数:发送指定数量的包后停止。-i 秒数:每次发送的间隔(默认 1 秒,Linux 需 root 才能小于 0.2 秒)。-s 字节数:设置发送数据包的大小(默认 56 字节,加上 ICMP 头共 64 字节)。-t TTL:设置 IP 生存时间(Linux 用-t,Windows 用-i)。-W 秒数:等待响应的超时时间。-4或-6:强制使用 IPv4 或 IPv6。-q:安静模式,只显示开头和结尾的统计信息。-D:在每行前显示时间戳(Linux)。
平台差异:Windows ping 默认发 4 个包后停止,参数不同(-n 代替 -c,-w 超时单位毫秒)。
ping -c 10 izhao.com.cn
curl
发送 HTTP/HTTPS 请求,也可用于 FTP、SMTP 等协议。
curl [选项] URL
下载相关参数:
-O:将文件保存为远程文件名。-o 文件名:将输出保存到指定文件。-C -:断点续传。
请求相关参数:
-X 方法:指定 HTTP 方法(GET、POST、PUT、DELETE 等)。-H "头:值":添加请求头。-d "数据":发送 POST 数据(自动设为application/x-www-form-urlencoded)。-F "name=@文件":发送 multipart/form-data(用于上传文件)。-b "name=value":发送 Cookie。-c 文件:将服务器设置的 Cookie 保存到文件。-A "字符串":设置 User-Agent。
输出相关参数:
-v:显示详细通信信息(调试用)。-s:静默模式(不显示进度和错误)。-L:跟随重定向(如 301/302)。-k:允许不安全的 SSL 连接(忽略证书验证)。-I:仅获取响应头(HEAD 请求)。
curl -O https://example.com/file.zip
curl -X POST -H "Content-Type: application/json" \
-d '{"key":"value"}' https://api.example.com
curl 'https://api.izhao.com.cn/api/hello' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Language: zh-CN,zh;q=0.9' \
-H 'Cache-Control: no-cache' \
-H 'Connection: keep-alive' \
-b 'token=b2a5725cf7044ae2ad003d2e609471a4' \
curl -F "image=@photo.jpg" https://uploads.example.com
一句话:curl 是多功能网络工具,支持几十种协议,偏向调试、API、上传、请求构造。
wget
网络下载工具,支持递归、断点续传、后台下载等。
wget [选项] URL
下载控制参数:
-O 文件名:另存为指定名称。-c:断点续传。-t 次数:设置重试次数,0 为无限重试。-T 秒数:设置连接超时时间。-q:安静模式,无输出。-v:详细日志输出。
递归下载参数:
-r:开启递归下载。-l 深度:限制递归层级。-np/--no-parent:不跳转上级目录。-A 后缀:只下载指定后缀文件。-R 后缀:排除指定后缀文件。
其他常用参数:
-b:后台后台下载。--limit-rate=速率:限速下载(例:200k、2M)。--user=账号 --password=密码:网站账号密码认证。-i 文本文件:读取文件内多行 URL 批量下载。-m/--mirror:全站镜像下载。
wget -O downloadFile.zip https://example.com/file.zip
wget -c https://example.com/largefile.zip
wget -r -np -l 2 https://site.com/docs/
wget --limit-rate=500k https://example.com/largefile.zip
wget -i urls.txt
一句话:wget 是纯粹的下载工具,偏向文件下载、断点续传、递归整站下载。
ssh
SSH 是安全外壳协议(Secure Shell),加密远程登录、远程管理服务器。
ssh [参数] 用户名@主机IP/域名
常用核心参数:
-p 端口:指定远程端口(非 22 端口必用)。-i 私钥文件:使用密钥登录。-L 本地端口:目标IP:目标端口:本地端口转发。-R 远程端口:本地IP:本地端口:远程端口转发。-N:只建立隧道,不登录终端。-f:后台运行 SSH 连接。-t:强制分配虚拟终端。-T:不分配终端,专门用于测试连接。
配置文件:~/.ssh/config。
ssh root@192.168.1.100
ssh -p 2000 user@1.1.1.1
ssh -L 8080:127.0.0.1:80 root@服务器IP
ssh -T git@github.com
ssh -vT git@github.com
ssh -i ~/.ssh/id_rsa_github git@github.com
scp
scp(Secure Copy)基于 SSH 加密传输文件。
scp [选项] 源 目标
scp [参数] 本地文件 用户名@主机:远程路径
scp [参数] 用户名@主机:远程文件 本地路径
常用参数:
-r:递归传输整个文件夹。-p:保留文件修改时间、权限。-P 端口:指定 SSH 端口(大写 P)。-C:传输时压缩提速。-i 私钥路径:指定密钥登录传输。
scp file.txt user@remote:/home/user/
scp user@remote:/home/user/file.txt ./
scp -r -i key.pem ~/data/ ec2-user@aws:/home/ec2-user/
scp user1@host1:/remote1/file user2@host2:/remote2/
netstat
显示网络连接、路由表、接口统计等信息。
netstat [选项]
常用参数:
-a:显示所有连接和监听端口。-n:不解析服务名(直接显示 IP 和端口号)。-r:显示路由表。-i:显示网络接口统计。-s:显示各协议的统计信息。-p:指定协议。
netstat -an -p tcp
netstat -an -p udp
netstat -an -p tcp | grep 9600
netstat -r
netstat -i
ifconfig / ip
查看和配置网络接口。
ifconfig 是网络接口配置(interface configuration),macOS、旧版 Linux 默认自带。
ip 是互联网协议(Internet Protocol),Linux 新一代网络管理命令,是现代 Linux 主流首选。macOS 不支持,仅 Linux 使用。
ifconfig [接口] [选项]
ip [对象] [命令] [选项]
ifconfig
ifconfig en0
# 查看 MAC 地址(物理地址)
ifconfig en0 | grep ether
# 临时开启网卡
ifconfig en0 up
# 临时关闭网卡
ifconfig en0 down
# 临时设置IP
ifconfig en0 192.168.1.105
ip addr
ip link show
ip link set eth0 up
ip link set eth0 down
ip addr add 192.168.1.106/24 dev eth0
ip addr del 192.168.1.106/24 dev eth0
ip route
系统信息与控制
df:查看磁盘使用情况。du:查看目录或文件大小。uname:查看系统信息。hostname:显示或设置系统的主机名。whoami:显示当前用户名。which / type:查找命令的可执行文件路径。date:显示或设置系统时间。man:查看命令帮助手册。history:查看命令历史记录。alias:创建命令别名。exit:退出当前 shell。
df
df(Disk Free)显示文件系统的磁盘使用情况。
df [选项] [文件或目录]
常用参数:
-h:以人类可读格式显示(KB、MB、GB)。-H:以 1000 为基数的人类可读格式(而非 1024)。-i:显示 inode 使用情况而非块使用情况。-l:仅显示本地文件系统(不显示网络挂载)。-g:以 GB 为单位显示。-m:以 MB 为单位显示。-k:以 KB 为单位显示(默认)。
df
df -h
df -h log.txt
df -i /
du
du(Disk Usage)估算文件或目录的磁盘使用空间。
du [选项] [文件或目录...]
常用参数:
-h:以人类可读格式显示。-s:仅显示总计(不显示子项)。-a:显示文件大小(默认只显示目录)。-c:显示总计行。-d 深度:限制显示深度(如-d 1只显示一级子目录)。-x:不跨越文件系统边界。
du -sh /Users/$USER/Documents
du -d 1 -h /Users/$USER/Documents
uname
uname(Unix Name)显示操作系统信息。
uname [选项]
常用参数:
-a:显示所有信息(内核名称、主机名、内核版本、硬件架构等)。-s:显示内核名称(macOS 显示Darwin)。-n:显示网络主机名。-r:显示内核版本。-v:显示内核版本详细信息。-m:显示硬件架构(如x86_64、arm64)。
uname
uname -a
# Darwin Macmini-USER.local 24.3.0 Darwin Kernel Version 24.3.0: Thu Jan 2 20:22:58 PST 2025; root:xnu-11215.81.4~3/RELEASE_ARM64_T8132 arm64
# Darwin:内核名称
# Macmini-USER.local:电脑的名字
# 24.3.0:Darwin 内核版本号
# Darwin Kernel Version 24.3.0: Thu Jan 2 20:22:58 PST 2025:内核编译时间
# xnu-11215.81.4~3/RELEASE_ARM64_T8132:xnu 是 macOS 内核全名;ARM64_T8132 是 Apple Silicon 芯片;T8132 是 M2 芯片
# arm64:系统架构(M 系列芯片)
hostname
显示或设置系统的主机名。
hostname
whoami
显示当前有效的用户名。
whoami
which / type
查找命令的可执行文件路径。
which node
type node
date
显示或设置系统时间。
date [选项] [+格式]
常用参数:
-u:显示 UTC 时间(协调世界时)。-r 文件名:显示文件的最后修改时间。-r 秒数:将指定秒数(从纪元开始)转换为日期时间。+格式:自定义输出格式(以+开头)。
格式占位符:
%Y:年(四位)%m:月(01-12)%d:日(01-31)%H:小时(00-23)%M:分钟(00-59)%S:秒(00-59)%F:等价于%Y-%m-%d%T:等价于%H:%M:%S%a:星期几缩写(如 Mon、Tue)%A:星期几全称
date
date "+%Y-%m-%d %H:%M:%S"
date -u
date -r log.txt
date -r 1704067200
man
man(Manual)查看命令的手册页(帮助文档)。
man [选项] [章节] 命令名
常用参数:
-k 关键词:搜索手册页名称和描述(等价于apropos)。-f 命令:显示命令的简短描述(等价于whatis)。-a:显示所有匹配的手册页(依次显示)。-w:仅显示手册页路径,不显示内容。
man ls
man -k ls
man -f ls
man -w ls
history
显示当前 shell 会话的命令历史记录。
history [选项]
常用参数:
-n:仅显示最近 n 条记录。-c:清除当前会话的历史记录。!!:重复上一条命令。!n:重复历史中第 n 条命令。
history
history -10
!!
!-2
alias
创建或查看命令别名(简化常用命令)。
alias [别名[='命令']]
持久化别名(写入配置文件):
- bash:
~/.bashrc。 - zsh(macOS 默认):
~/.zshrc。
alias
alias gst='git status'
alias gst
unalias gst
exit
退出当前 shell 或终端会话。
exit [退出码]
常用形式:
exit:默认退出码为上一个命令的退出码($?)。exit 0:正常退出。exit 1:非正常退出(表示错误)。
管道、重定向与作业控制
|:管道,将前一个命令输出作为后一个输入。jobs:查看后台任务。fg / bg:将任务放到前台/后台运行。
|(管道)
将前一个命令的标准输出作为后一个命令的标准输入。
ps aux | grep node
ls -la | less
cat log.txt | wc -l
jobs
显示当前 shell 会话中的后台任务列表。
注意:jobs 只认当前终端窗口 / 标签页的任务,换窗口就看不到了。
jobs [选项]
常用参数:
-l:显示进程 PID。-p:仅显示任务组进程 ID。
sleep 100 &
jobs
jobs -l
fg / bg
fg(Foreground)将后台任务放到前台运行。
bg(Background)将暂停的任务放到后台继续运行。
fg [任务号]
bg [任务号]
常见用法:
fg:将最近一个后台任务放到前台。fg %任务号:将指定任务放到前台。bg:将最近一个暂停任务放到后台继续运行。bg %任务号:将指定暂停任务放到后台继续运行。
sleep 100 &
jobs
fg %1
bg %1