Shell脚本学习指南-附录B-重要的UNIX命令
附录 B
附录B 重要的UNIX命令
聚焦脚本开发高频命令;区分:Shell内置命令、文本处理、文件、进程、其他程序。 内置命令标记「🔹内置」;外部普通命令无标记。
Shell与内置命令
背景:内置命令运行于当前Shell进程内部,不会创建新子进程;执行速度更快。写shell脚本优先掌握。
| 命令 | 作用说明 | 常用参数 | 示例 |
|---|---|---|---|
🔹. / source |
读取并在当前shell执行脚本文件,不新建子进程 | 无 | . ./env.sh source ~/.bashrc |
🔹break |
跳出for/while/until/select循环 |
break n:跳出n层循环 |
while true; do break; done |
🔹cd |
切换当前工作目录 | cd -回到上一次目录;cd ~到家目录 |
cd /var/log cd - |
🔹continue |
直接进入循环下一轮,跳过本轮后续代码 | continue n 跳到外层第n层循环 |
for i in {1..3}; do continue; done |
🔹eval |
把参数拼接后,再次交给shell解析执行 | 无 | eval "echo \$var" |
🔹exec |
用新程序替换当前shell进程,执行后不再返回原shell | 无 | exec /bin/bash |
🔹exit |
退出脚本/终端,可指定退出状态码 | exit N N为退出码,0成功,非0失败 |
exit 0;exit 1 |
🔹export |
把变量导出到子进程环境,子shell可以读取该变量 | export VAR=value |
export PATH="/bin:$PATH" |
🔹false |
返回非0失败退出码,什么都不做,用于循环占位 | 无 | while false; do :; done |
🔹getopts |
解析脚本的命令行选项参数,处理 -a -b 这类参数 |
内置变量OPTIND、OPTARG |
while getopts "ab:" opt; do … done |
🔹read |
读取标准输入,把一行内容存入shell变量 | ‑p "提示" 打印提示;‑r关闭反斜杠转义 |
read -r filename read -p "请输入:" name |
🔹readonly |
设置变量只读,后续不能修改、不能unset | readonly VAR |
readonly MAX_NUM=100 |
🔹return |
shell函数返回退出状态码,仅用于函数内部 | return N |
fun(){ return 2; } |
🔹set |
设置shell行为选项;修改位置参数$1 $2 |
‑e出错退出;‑u未定义变量报错;‑x开启调试打印 |
set -eux |
🔹shift |
删除位置参数,参数整体向左移动 | shift n 向左移n个参数 |
shift 1;处理脚本$1 $2 |
🔹test / [ ] |
条件判断:字符串、数字、文件属性检测 | ‑f普通文件;‑d目录;‑gt大于 |
if [ -f "a.txt" ]; then … fi |
🔹trap |
捕获操作系统信号,脚本收到信号执行自定义逻辑 | trap 动作 信号名 |
trap 'echo 收到中断' SIGINT |
🔹true |
返回0成功退出码,什么都不做,常用于循环占位 | 无 | while true; do sleep 1; done |
🔹type |
查看命令类型:内置/外部/别名/关键字 | ‑a显示全部匹配 |
type cd;type ls |
🔹declare |
声明变量,设置变量属性(整数、只读、数组) | ‑i整数;‑r只读;‑a数组 |
declare -i sum=0 |
🔹ulimit |
设置进程资源限制:文件句柄、内存、最大进程数 | ‑a打印全部限制;‑n修改打开文件数 |
ulimit -a |
🔹unset |
删除shell变量、删除函数 | unset 变量名 |
unset temp_var |
basename |
取出路径最后文件名;可以删除后缀,多用于命令替换 | ‑s 后缀 去掉扩展名 |
basename /tmp/test.txt → test.txt basename -s .txt /tmp/test.txt → test |
dirname |
去除文件名,只保留目录路径 | 无 | dirname /tmp/a/b/file.txt → /tmp/a/b |
env |
设置临时环境变量运行命令;查看全部环境变量 | 无 | env LANG=C ls |
id |
打印用户UID、GID、所属用户组信息 | ‑u只输出uid;‑g只输出gid |
id;id -u |
date |
打印/格式化系统日期时间 | +格式串自定义输出格式 |
date +"%Y‑%m‑%d %H:%M:%S" |
who |
查看当前登录系统的用户列表 | 无 | who |
stty |
修改终端设备属性(回显、行模式等) | 无 | stty -echo 关闭密码回显;stty echo恢复 |
文本处理
背景:shell脚本绝大多数工作都是文本解析、过滤、转换。这一组是高频核心工具。
| 命令 | 作用说明 | 常用参数 | 示例 |
|---|---|---|---|
awk |
文本编程语言,按列/字段处理文本,脚本主力工具 | ‑F指定字段分隔符 |
awk -F ':' '{print $1}' /etc/passwd |
cat |
读取文件,输出到标准输出;拼接多个文件 | ‑n打印行号 |
cat file.txt cat a.txt b.txt > all.txt |
cmp |
逐字节对比两个文件,发现差异立刻停止,适合二进制对比 | 无 | cmp file1.bin file2.bin |
cut |
截取文本指定列/指定字符;提取字段 | ‑d分隔符;‑f取第几列;‑c取字符位置 |
cut -d':' -f1 /etc/passwd |
dd |
底层数据拷贝,磁盘镜像、字节转换;⚠参数格式特殊if= of= |
if=输入 of=输出 bs=块大小 |
dd if=/dev/sda of=/tmp/disk.img bs=4M |
echo |
打印文本到标准输出 | ‑n不输出换行;‑e开启转义字符 |
echo "hello world";echo -n "no new line" |
egrep |
使用扩展正则表达式ERE搜索匹配行,等价grep -E |
‑i忽略大小写;‑v反向过滤;‑c统计行数 |
egrep -i "error" app.log |
expand |
把Tab制表符替换为空格 | 无 | expand tabfile.txt |
fgrep |
纯字符串精确匹配(不解析正则)等价grep -F |
‑f file从文件读取多个关键词 |
fgrep "literal$string" log.txt |
fmt |
简单段落格式化,整理文本换行 | 无 | fmt longtext.txt |
grep |
基础正则BRE搜索文本,打印匹配行 | ‑i忽略大小写;‑v反向过滤;‑n输出行号 |
grep "warn" app.log |
iconv |
字符编码转换(gbk ↔ utf‑8) | ‑f源编码 ‑t目标编码 |
iconv -f GBK -t UTF‑8 gbk.txt -o utf8.txt |
join |
对两个已经排序的文件,按关键字合并记录 | ‑1文件1的key列;‑2文件2的key列 |
join file1.sorted file2.sorted |
less |
分页阅读工具(推荐优先使用,可向上翻页搜索) | ‑N显示行号 |
less huge.log |
more |
老式分页工具,只能向下翻页,功能弱于less | 无 | more bigfile.txt |
printf |
格式化输出,比echo可控,脚本推荐优先printf | 格式字符串 + 参数 | printf "name=%s\n" "zhangsan" |
sed |
流编辑器,流式修改、替换、删除文本,不改动原文件(重定向才写回) | ‑e多条表达式;‑i原地修改文件⚠谨慎 |
sed 's/old/new/g' file.txt |
sort |
对文本行排序 | ‑n数字排序;‑k指定排序列;‑r逆序 |
sort -n -k2 data.txt |
tee |
标准输入,同时输出到屏幕+写入多个文件 | ‑a追加模式,不覆盖 |
cat log.txt | tee out.log |
tr |
字符转换、删除、压缩重复字符 | ‑d删除字符;‑s压缩重复字符 |
tr 'a-z' 'A-Z' < file.txt tr -s '\n'压缩空行 |
unexpand |
把空格转换回Tab制表符 | 无 | unexpand spacefile.txt |
uniq |
去除已经排序文件的重复相邻行;统计重复次数 | ‑c统计计数;‑d只打印重复行 |
sort list.txt | uniq -c |
wc |
统计:行数、单词数、字节数 | ‑l统计行;‑w单词;‑c字节 |
wc -l access.log |
文件
文件操作、权限、查找、压缩打包命令
| 命令 | 作用说明 | 常用参数 | 示例 |
|---|---|---|---|
bzip2 / bunzip2 |
高压缩率 bz2 压缩解压 | ‑d解压 |
bzip2 bigfile;bunzip2 bigfile.bz2 |
chgrp |
修改文件/目录所属用户组 | ‑R递归修改目录下全部内容 |
chgrp dev testdir |
chmod |
修改文件、目录权限(八进制/符号模式) | ‑R递归;‑u/g/o/a用户组其他人 |
chmod 0640 file.txt chmod +x run.sh |
chown |
修改文件/目录所有者(用户+组) | ‑R递归修改 |
chown zhangsan:dev test.txt |
cksum |
POSIX标准,输出文件校验和+字节数 | 无 | cksum myfile.tar |
comm |
对比两个已经排序的文件,输出三列:仅A有、仅B有、两者共有行 | ‑1隐藏第1列;‑2隐藏第2列;‑3隐藏第3列 |
comm sorted_a.txt sorted_b.txt |
cp |
复制文件/目录 | ‑r / ‑R递归复制目录;‑p保留权限时间戳 |
cp -rp dir1 dir2 |
df |
查看磁盘分区空间使用情况 | ‑i查看inode占用;‑h人类可读单位 |
df -h;df -i |
diff |
对比两个文本文件,输出差异 | ‑u unified格式,补丁常用格式 |
diff -u old.txt new.txt |
du |
统计目录/文件占用磁盘大小 | ‑s汇总总和;‑h人类可读单位 |
du -sh /home |
file |
探测文件真实数据类型(文本、ELF可执行、压缩包) | 无 | file /bin/ls;file test.txt |
find |
递归遍历目录树,按条件查找文件,脚本高频工具 | ‑name按文件名;‑type f/d普通文件/目录;‑exec执行后续命令 |
find /tmp -type f -name "*.log" |
gzip / gunzip |
gz格式压缩解压 | ‑d解压;‑1快压缩;‑9高压缩比 |
gzip file;gunzip file.gz |
head |
读取文件开头N行 | ‑n N取前N行 |
head -n 20 access.log |
locate |
根据文件名快速查找;依赖预生成数据库updatedb | 无 | locate nginx.conf |
ls |
列出目录文件信息 | ‑l长格式权限;‑a显示隐藏文件;‑h可读大小 |
ls -lh /var/log |
md5sum |
MD5哈希校验,验证文件完整性 | 无 | md5sum download.iso |
mktemp |
生成安全唯一临时文件名/临时文件,脚本写临时文件强烈推荐 | ‑d生成临时目录 |
tmpfile=$(mktemp) |
od |
八进制/十六进制打印二进制原始内容,查看不可见字节 | ‑t x十六进制输出 |
od -t x binary.dat |
patch |
读取diff差异文件,给原文件打补丁 | 无 | patch < diff.patch |
pwd |
打印当前工作目录(现代shell内置) | 无 | pwd |
rm |
删除文件;⚠删除目录需要‑r |
‑r / ‑R递归删除目录;‑f强制不提示 |
rm -rf tempdir |
rmdir |
只删除空目录,目录有文件则失败 | 无 | rmdir emptydir |
strings |
从二进制/可执行文件提取里面可打印字符串 | 无 | strings /bin/bash |
tail |
读取文件末尾N行;‑f跟踪文件增长(实时日志) |
‑n N末尾N行;‑f持续跟踪 |
tail -n 100 app.log tail -f app.log |
tar |
打包工具,可同时压缩;归档备份、软件发布标准格式 | ‑c创建包;‑x解压;‑zgzip;‑jbzip2;‑v打印过程 |
tar -czvf out.tar.gz dir/ tar -xzvf out.tar.gz |
touch |
修改文件atime/mtime时间戳;文件不存在则创建空文件 | 无 | touch newfile.txt |
🔹umask |
设置新建文件/目录权限掩码,拿掉哪些权限位 | 无 | umask 0027;umask查看当前值 |
zip / unzip |
zip压缩包,跨Windows/Linux平台可移植 | 无 | zip out.zip file1 file2;unzip out.zip |
进程
进程调度、查看状态、发送信号,脚本做后台任务、定时任务必备
| 命令 | 作用说明 | 常用参数 | 示例 |
|---|---|---|---|
at |
指定某个时间点执行一次任务,只执行1次 | ‑l查看任务列表 |
at 23:00 <<EOF echo run once EOF |
batch |
系统负载低的时候,自动执行任务 | 无 | batch <<EOF echo low‑load run EOF |
cron |
后台守护进程,周期性定时执行任务 | 配置文件crontab编辑 |
— |
crontab |
编辑用户定时任务表 | ‑e编辑;‑l列出;‑r删除全部任务 |
crontab -e |
fuser |
查看哪个进程正在占用某个文件、socket | 无 | fuser /mnt/cdrom |
kill |
向进程发送信号;默认SIGTERM温和终止 | ‑9发送SIGKILL强制杀死进程;‑l列出全部信号 |
kill 1234 kill -9 1234 |
nice |
程序启动时设置CPU调度优先级;数值范围‑20~19,越小优先级越高 | ‑n N优先级数值 |
nice -n 10 ./longtask.sh |
ps |
查看进程状态快照 | ‑ef全量所有进程;auxBSD风格输出 |
ps -ef | grep nginx |
renice |
已经运行的进程,修改它的调度优先级 | ‑n N -p PID |
renice -n 5 -p 4567 |
sleep |
暂停程序指定秒数 | 数字,单位秒 | sleep 5 |
top |
交互式实时查看CPU、内存占用最高进程 | 无 | top |
🔹wait |
shell内置,等待后台子进程结束,获取退出码 | wait PID等待指定pid;无参数等待全部后台进程 |
sleep 10 & wait $! |
xargs |
读取标准输入,拼装成命令参数,常配合find使用 | ‑n每次传递几个参数;‑0安全处理带空格文件名 |
find . -name "*.tmp" | xargs rm |
其他程序
| 命令 | 作用说明 | 常用参数 | 示例 |
|---|---|---|---|
man |
查看命令/系统调用帮助手册 | ‑k按关键词搜索手册 |
man grep;man -k chmod |
logger |
往系统syslog日志写入日志消息 | 无 | logger "shell脚本执行完成" |
ssh |
加密远程登录执行远端机器命令 | 无 | ssh [email protected] |
scp |
基于ssh安全远程拷贝文件 | ‑r拷贝目录 |
scp file.tar user@host:/tmp/ |
uptime |
打印系统开机时长,1/5/15分钟系统负载 | 无 | uptime |
make |
编译构建工具,读取Makefile规则 | 无 | make && make install |
locale |
查看系统字符集、区域语言配置 | 无 | locale;locale -a查看全部可用locale |
info |
GNU超文本帮助文档(部分gnu工具比man更完整) | 无 | info sed |
mail |
发送简单邮件 | 无 | echo "text" | mail [email protected] |
RCS版本控制命令(老式版本控制系统,现代工作基本用git,简单了解即可):
ci签入、co签出、rcs维护库、rcsdiff对比版本、rlog打印变更日志。
文章作者 会写代码的小郎中
上次更新 2011-07-30
许可协议 CC BY-NC-ND 4.0