欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Bash中文速查表

程序员文章站 2022-08-25 08:29:26
当年学习 Linux 时就是靠着一张常用命令小卡片,敲啥命令忘记了,经常拿起来看看,后来知道这玩意儿叫做速查表(Cheatsheet),于是开始有意识收集和整理各种常用的速查表。对于很多工具来说,看书和大篇大篇的文章都太浪费时间了,其实大部分时候,你只需要一张小巧的表格就够了。 ......

最好用的中文速查表(cheatsheet)

来源:https://github.com/skywind3000/awesome-cheatsheets

感谢网友们的贡献!

 

  1 ##############################################################################
  2 # 常用快捷键(默认使用 emacs 键位)
  3 ##############################################################################
  4 
  5 ctrl+a              # 移动到行首,同 <home>
  6 ctrl+b              # 向后移动,同 <left>
  7 ctrl+c              # 结束当前命令
  8 ctrl+d              # 删除光标前的字符,同 <delete> ,或者没有内容时,退出会话
  9 ctrl+e              # 移动到行末,同 <end>
 10 ctrl+f              # 向前移动,同 <right>
 11 ctrl+g              # 退出当前编辑(比如正在 ctrl+r 搜索历史时)
 12 ctrl+h              # 删除光标左边的字符,同 <backspace>
 13 ctrl+k              # 删除光标位置到行末的内容
 14 ctrl+l              # 清屏并重新显示
 15 ctrl+n              # 移动到命令历史的下一行,同 <down>
 16 ctrl+o              # 类似回车,但是会显示下一行历史
 17 ctrl+p              # 移动到命令历史的上一行,同 <up>
 18 ctrl+r              # 历史命令反向搜索,使用 ctrl+g 退出搜索
 19 ctrl+s              # 历史命令正向搜索,使用 ctrl+g 退出搜索
 20 ctrl+t              # 交换前后两个字符
 21 ctrl+u              # 删除字符到行首
 22 ctrl+v              # 输入字符字面量,先按 ctrl+v 再按任意键
 23 ctrl+w              # 删除光标左边的一个单词
 24 ctrl+x              # 列出可能的补全
 25 ctrl+y              # 粘贴前面 ctrl+u/k/w 删除过的内容
 26 ctrl+z              # 暂停前台进程返回 bash,需要时可用 fg 将其切换回前台
 27 ctrl+_              # 撤销(undo),有的终端将 ctrl+_ 映射为 ctrl+/ 或 ctrl+7
 28 
 29 alt+b               # 向后(左边)移动一个单词
 30 alt+d               # 删除光标后(右边)一个单词
 31 alt+f               # 向前(右边)移动一个单词
 32 alt+t               # 交换字符
 33 alt+backspace       # 删除光标前面一个单词,类似 ctrl+w,但不影响剪贴板
 34 
 35 ctrl+x ctrl+x       # 连续按两次 ctrl+x,光标在当前位置和行首来回跳转 
 36 ctrl+x ctrl+e       # 用你指定的编辑器,编辑当前命令
 37 
 38 
 39 ##############################################################################
 40 # bash 基本操作
 41 ##############################################################################
 42 
 43 exit                # 退出当前登陆
 44 env                 # 显示环境变量
 45 echo $shell         # 显示你在使用什么 shell
 46 
 47 bash                # 使用 bash,用 exit 返回
 48 which bash          # 搜索 $path,查找哪个程序对应命令 bash
 49 whereis bash        # 搜索可执行,头文件和帮助信息的位置,使用系统内建数据库
 50 whatis bash         # 查看某个命令的解释,一句话告诉你这是干什么的
 51 
 52 clear               # 清初屏幕内容
 53 reset               # 重置终端(当你不小心 cat 了一个二进制,终端状态乱掉时使用)
 54 
 55 
 56 ##############################################################################
 57 # 目录操作
 58 ##############################################################################
 59 
 60 cd                  # 返回自己 $home 目录
 61 cd {dirname}        # 进入目录
 62 pwd                 # 显示当前所在目录
 63 mkdir {dirname}     # 创建目录
 64 mkdir -p {dirname}  # 递归创建目录
 65 pushd {dirname}     # 目录压栈并进入新目录
 66 popd                # 弹出并进入栈顶的目录
 67 dirs -v             # 列出当前目录栈
 68 cd -                # 回到之前的目录
 69 cd -{n}             # 切换到目录栈中的第 n个目录,比如 cd -2 将切换到第二个
 70 
 71 
 72 ##############################################################################
 73 # 文件操作
 74 ##############################################################################
 75 
 76 ls                  # 显示当前目录内容,后面可接目录名:ls {dir} 显示指定目录
 77 ls -l               # 列表方式显示目录内容,包括文件日期,大小,权限等信息
 78 ls -1               # 列表方式显示目录内容,只显示文件名称,减号后面是数字 1
 79 ls -a               # 显示所有文件和目录,包括隐藏文件(.开头的文件/目录名)
 80 ln -s {fn} {link}   # 给指定文件创建一个软链接
 81 cp {src} {dest}     # 拷贝文件,cp -r dir1 dir2 可以递归拷贝(目录)
 82 rm {fn}             # 删除文件,rm -r 递归删除目录,rm -f 强制删除
 83 mv {src} {dest}     # 移动文件,如果 dest 是目录,则移动,是文件名则覆盖
 84 touch {fn}          # 创建或者更新一下制定文件
 85 cat {fn}            # 输出文件原始内容
 86 any_cmd > {fn}      # 执行任意命令并将标准输出重定向到指定文件
 87 more {fn}           # 逐屏显示某文件内容,空格翻页,q 退出
 88 less {fn}           # 更高级点的 more,更多操作,q 退出
 89 head {fn}           # 显示文件头部数行,可用 head -3 abc.txt 显示头三行
 90 tail {fn}           # 显示文件尾部数行,可用 tail -3 abc.txt 显示尾部三行
 91 tail -f {fn}        # 持续显示文件尾部数据,可用于监控日志
 92 nano {fn}           # 使用 nano 编辑器编辑文件
 93 vim {fn}            # 使用 vim 编辑文件
 94 diff {f1} {f2}      # 比较两个文件的内容
 95 wc {fn}             # 统计文件有多少行,多少个单词
 96 chmod 644 {fn}      # 修改文件权限为 644,可以接 -r 对目录循环改权限
 97 chgrp group {fn}    # 修改文件所属的用户组
 98 chown user1 {fn}    # 修改文件所有人为 user1, chown user1:group1 fn 可以修改组
 99 file {fn}           # 检测文件的类型和编码
100 basename {fn}       # 查看文件的名字(不包括路径)
101 dirname {fn}        # 查看文件的路径(不包括名字)
102 grep {pat} {fn}     # 在文件中查找出现过 pat 的内容
103 grep -r {pat} .     # 在当前目录下递归查找所有出现过 pat 的文件内容
104 stat {fn}           # 显示文件的详细信息
105 
106 
107 ##############################################################################
108 # 用户管理
109 ##############################################################################
110 
111 whoami              # 显示我的用户名
112 who                 # 显示已登陆用户信息,w / who / users 内容略有不同
113 w                   # 显示已登陆用户信息,w / who / users 内容略有不同
114 users               # 显示已登陆用户信息,w / who / users 内容略有不同
115 passwd              # 修改密码,passwd {user} 可以用于 root 修改别人密码
116 finger {user}       # 显示某用户信息,包括 id, 名字, 登陆状态等
117 adduser {user}      # 添加用户
118 deluser {user}      # 删除用户
119 w                   # 查看谁在线
120 su                  # 切换到 root 用户
121 su -                # 切换到 root 用户并登陆(执行登陆脚本)
122 su {user}           # 切换到某用户
123 su -{user}          # 切换到某用户并登陆(执行登陆脚本)
124 id {user}           # 查看用户的 uid,gid 以及所属其他用户组
125 id -u {user}        # 打印用户 uid
126 id -g {user}        # 打印用户 gid
127 write {user}        # 向某用户发送一句消息
128 last                # 显示最近用户登陆列表
129 last {user}         # 显示登陆记录
130 lastb               # 显示失败登陆记录
131 lastlog             # 显示所有用户的最近登陆记录
132 sudo {command}      # 以 root 权限执行某命令
133 
134 
135 ##############################################################################
136 # 进程管理
137 ##############################################################################
138 
139 ps                        # 查看当前会话进程
140 ps ax                     # 查看所有进程,类似 ps -e
141 ps aux                    # 查看所有进程详细信息,类似 ps -ef
142 ps auxww                  # 查看所有进程,并且显示进程的完整启动命令
143 ps -u {user}              # 查看某用户进程
144 ps axjf                   # 列出进程树
145 ps xjf -u {user}          # 列出某用户的进程树
146 ps -eo pid,user,command   # 按用户指定的格式查看进程
147 ps aux | grep httpd       # 查看名为 httpd 的所有进程
148 ps --ppid {pid}           # 查看父进程为 pid 的所有进程
149 pstree                    # 树形列出所有进程,pstree 默认一般不带,需安装
150 pstree {user}             # 进程树列出某用户的进程
151 pstree -u                 # 树形列出所有进程以及所属用户
152 pgrep {procname}          # 搜索名字匹配的进程的 pid,比如 pgrep apache2
153 
154 kill {pid}                # 结束进程
155 kill -9 {pid}             # 强制结束进程,9/sigkill 是强制不可捕获结束信号
156 kill -kill {pid}          # 强制执行进程,kill -9 的另外一种写法
157 kill -l                   # 查看所有信号
158 kill -l term              # 查看 term 信号的编号
159 killall {procname}        # 按名称结束所有进程
160 pkill {procname}          # 按名称结束进程,除名称外还可以有其他参数
161 
162 top                       # 查看最活跃的进程
163 top -u {user}             # 查看某用户最活跃的进程
164 
165 any_command &             # 在后台运行某命令,也可用 ctrl+z 将当前进程挂到后台
166 jobs                      # 查看所有后台进程(jobs)
167 bg                        # 查看后台进程,并切换过去
168 fg                        # 切换后台进程到前台
169 fg {job}                  # 切换特定后台进程到前台
170 
171 trap cmd sig1 sig2        # 在脚本中设置信号处理命令
172 trap "" sig1 sig2         # 在脚本中屏蔽某信号
173 trap - sig1 sig2          # 恢复默认信号处理行为
174 
175 nohup {command}           # 长期运行某程序,在你退出登陆都保持它运行
176 nohup {command} &         # 在后台长期运行某程序
177 disown {pid|jid}          # 将进程从后台任务列表(jobs)移除
178 
179 wait                      # 等待所有后台进程任务结束
180 
181 
182 ##############################################################################
183 # 常用命令:ssh / 系统信息 / 网络
184 ##############################################################################
185 
186 ssh user@host             # 以用户 user 登陆到远程主机 host
187 ssh -p {port} user@host   # 指定端口登陆主机
188 ssh-copy-id user@host     # 拷贝你的 ssh key 到远程主机,避免重复输入密码
189 scp {fn} user@host:path   # 拷贝文件到远程主机
190 scp user@host:path dest   # 从远程主机拷贝文件回来
191 scp -p {port} ...         # 指定端口远程拷贝文件
192 
193 uname -a                  # 查看内核版本等信息
194 man {help}                # 查看帮助
195 man -k {keyword}          # 查看哪些帮助文档里包含了该关键字
196 info {help}               # 查看 info pages,比 man 更强的帮助系统
197 uptime                    # 查看系统启动时间
198 date                      # 显示日期
199 cal                       # 显示日历
200 vmstat                    # 显示内存和 cpu 使用情况
201 vmstat 10                 # 每 10 秒打印一行内存和 cpu情况,ctrl+c 退出
202 free                      # 显示内存和交换区使用情况
203 df                        # 显示磁盘使用情况
204 du                        # 显示当前目录占用,du . --max-depth=2 可以指定深度
205 uname                     # 显示系统版本号
206 hostname                  # 显示主机名称
207 showkey -a                # 查看终端发送的按键编码
208 
209 ping {host}               # ping 远程主机并显示结果,ctrl+c 退出
210 ping -c n {host}          # ping 远程主机 n 次
211 traceroute {host}         # 侦测路由连通情况
212 mtr {host}                # 高级版本 traceroute
213 host {domain}             # dns 查询,{domain} 前面可加 -a 查看详细信息
214 whois {domain}            # 取得域名 whois 信息
215 dig {domain}              # 取得域名 dns 信息
216 route -n                  # 查看路由表
217 netstat -a                # 列出所有端口
218 netstat -an               # 查看所有连接信息,不解析域名
219 netstat -anp              # 查看所有连接信息,包含进程信息(需要 sudo)
220 netstat -l                # 查看所有监听的端口
221 netstat -t                # 查看所有 tcp 链接
222 netstat -lntu             # 显示所有正在监听的 tcp 和 udp 信息
223 netstat -lntup            # 显示所有正在监听的 socket 及进程信息
224 netstat -i                # 显示网卡信息
225 netstat -rn               # 显示当前系统路由表,同 route -n
226 ss -an                    # 比 netstat -an 更快速更详细
227 ss -s                     # 统计 tcp 的 established, wait 等
228 
229 wget {url}                # 下载文件,可加 --no-check-certificate 忽略 ssl 验证
230 wget -qo- {url}           # 下载文件并输出到标准输出(不保存)
231 curl -sl {url}            # 同 wget -qo- {url} 没有 wget 的时候使用
232 
233 sz {file}                 # 发送文件到终端,zmodem 协议
234 rz                        # 接收终端发送过来的文件
235 
236 
237 ##############################################################################
238 # 变量操作
239 ##############################################################################
240 
241 varname=value             # 定义变量
242 varname=value command     # 定义子进程变量并执行子进程
243 echo $varname             # 查看变量内容
244 echo $$                   # 查看当前 shell 的进程号
245 echo $!                   # 查看最近调用的后台任务进程号
246 echo $?                   # 查看最近一条命令的返回码
247 export varname=value      # 设置环境变量(将会影响到子进程)
248 
249 array[0]=vala             # 定义数组
250 array[1]=valb
251 array[2]=valc
252 array=([0]=vala [1]=valb [2]=valc)   # 另一种方式
253 array=(vala valb valc)               # 另一种方式
254 
255 ${array[i]}               # 取得数组中的元素
256 ${#array[@]}              # 取得数组的长度
257 ${#array[i]}              # 取得数组中某个变量的长度
258 
259 declare -a                # 查看所有数组
260 declare -f                # 查看所有函数
261 declare -f                # 查看所有函数,仅显示函数名
262 declare -i                # 查看所有整数
263 declare -r                # 查看所有只读变量
264 declare -x                # 查看所有被导出成环境变量的东西
265 declare -p varname        # 输出变量是怎么定义的(类型+值)
266 
267 ${varname:-word}          # 如果变量不为空则返回变量,否则返回 word
268 ${varname:=word}          # 如果变量不为空则返回变量,否则赋值成 word 并返回
269 ${varname:?message}       # 如果变量不为空则返回变量,否则打印错误信息并退出
270 ${varname:+word}          # 如果变量不为空则返回 word,否则返回 null
271 ${varname:offset:len}     # 取得字符串的子字符串
272 
273 ${variable#pattern}       # 如果变量头部匹配 pattern,则删除最小匹配部分返回剩下的
274 ${variable##pattern}      # 如果变量头部匹配 pattern,则删除最大匹配部分返回剩下的
275 ${variable%pattern}       # 如果变量尾部匹配 pattern,则删除最小匹配部分返回剩下的
276 ${variable%%pattern}      # 如果变量尾部匹配 pattern,则删除最大匹配部分返回剩下的
277 ${variable/pattern/str}   # 将变量中第一个匹配 pattern 的替换成 str,并返回
278 ${variable//pattern/str}  # 将变量中所有匹配 pattern 的地方替换成 str 并返回
279 
280 ${#varname}               # 返回字符串长度
281 
282 *(patternlist)            # 零次或者多次匹配
283 +(patternlist)            # 一次或者多次匹配
284 ?(patternlist)            # 零次或者一次匹配
285 @(patternlist)            # 单词匹配
286 !(patternlist)            # 不匹配
287 
288 array=($text)             # 按空格分隔 text 成数组,并赋值给变量
289 ifs="/" array=($text)     # 按斜杆分隔字符串 text 成数组,并赋值给变量
290 text="${array[*]}"        # 用空格链接数组并赋值给变量
291 text=$(ifs=/; echo "${array[*]}")  # 用斜杠链接数组并赋值给变量
292 
293 a=( foo bar "a  b c" 42 ) # 数组定义
294 b=("${a[@]:1:2}")         # 数组切片:b=( bar "a  b c" )
295 c=("${a[@]:1}")           # 数组切片:c=( bar "a  b c" 42 )
296 echo "${b[@]}"            # bar a  b c
297 echo "${b[1]}"            # a  b c
298 echo "${c[@]}"            # bar a  b c 42
299 echo "${c[@]: -2:2}"      # a  b c 42  减号前的空格是必须的
300 
301 $(unix command)           # 运行命令,并将标准输出内容捕获并返回
302 varname=$(id -u user)     # 将用户名为 user 的 uid 赋值给 varname 变量
303 
304 num=$(expr 1 + 2)         # 兼容 posix sh 的计算,使用 expr 命令计算结果
305 num=$(expr $num + 1)      # 数字自增
306 expr 2 \* \( 2 + 3 \)     # 兼容 posix sh 的复杂计算,输出 10
307 
308 num=$((1 + 2))            # 计算 1+2 赋值给 num,使用 bash 独有的 $((..)) 计算
309 num=$(($num + 1))         # 变量递增
310 num=$((num + 1))          # 变量递增,双括号内的 $ 可以省略
311 num=$((1 + (2 + 3) * 2))  # 复杂计算
312 
313 
314 ##############################################################################
315 # 事件指示符
316 ##############################################################################
317 
318 !!                  # 上一条命令
319 !^                  # 上一条命令的第一个单词
320 !$                  # 上一条命令的最后一个单词
321 !string             # 最近一条包含string的命令
322 !^string1^string2   # 最近一条包含string1的命令, 快速替换为string2, 相当于!!:s/string1/string2/
323 !#                  # 本条命令之前所有的输入内容
324 
325 
326 ##############################################################################
327 # 函数
328 ##############################################################################
329 
330 # 定义一个新函数
331 function myfunc() {
332     # $1 代表第一个参数,$n 代表第 n 个参数
333     # $# 代表参数个数
334     # $0 代表被调用者自身的名字
335     # $@ 代表所有参数,类型是个数组,想传递所有参数给其他命令用 cmd "$@" 
336     # $* 空格链接起来的所有参数,类型是字符串
337     {shell commands ...}
338 }
339 
340 myfunc                    # 调用函数 myfunc 
341 myfunc arg1 arg2 arg3     # 带参数的函数调用
342 myfunc "$@"               # 将所有参数传递给函数
343 myfunc "${array[@]}"      # 将一个数组当作多个参数传递给函数
344 shift                     # 参数左移
345 
346 unset -f myfunc           # 删除函数
347 declare -f                # 列出函数定义
348 
349 
350 ##############################################################################
351 # 条件判断(兼容 posix sh 的条件判断):man test
352 ##############################################################################
353 
354 statement1 && statement2  # and 操作符
355 statement1 || statement2  # or 操作符
356 
357 exp1 -a exp2              # exp1 和 exp2 同时为真时返回真(posix xsi扩展)
358 exp1 -o exp2              # exp1 和 exp2 有一个为真就返回真(posix xsi扩展)
359 ( expression )            # 如果 expression 为真时返回真,输入注意括号前反斜杆
360 ! expression              # 如果 expression 为假那返回真
361 
362 str1 = str2               # 判断字符串相等,如 [ "$x" = "$y" ] && echo yes
363 str1 != str2              # 判断字符串不等,如 [ "$x" != "$y" ] && echo yes
364 str1 < str2               # 字符串小于,如 [ "$x" \< "$y" ] && echo yes
365 str2 > str2               # 字符串大于,注意 < 或 > 是字面量,输入时要加反斜杆
366 -n str1                   # 判断字符串不为空(长度大于零)
367 -z str1                   # 判断字符串为空(长度等于零)
368 
369 -a file                   # 判断文件存在,如 [ -a /tmp/abc ] && echo "exists"
370 -d file                   # 判断文件存在,且该文件是一个目录
371 -e file                   # 判断文件存在,和 -a 等价
372 -f file                   # 判断文件存在,且该文件是一个普通文件(非目录等)
373 -r file                   # 判断文件存在,且可读
374 -s file                   # 判断文件存在,且尺寸大于0
375 -w file                   # 判断文件存在,且可写
376 -x file                   # 判断文件存在,且执行
377 -n file                   # 文件上次修改过后还没有读取过
378 -o file                   # 文件存在且属于当前用户
379 -g file                   # 文件存在且匹配你的用户组
380 file1 -nt file2           # 文件1 比 文件2 新
381 file1 -ot file2           # 文件1 比 文件2 旧
382 
383 num1 -eq num2             # 数字判断:num1 == num2
384 num1 -ne num2             # 数字判断:num1 != num2
385 num1 -lt num2             # 数字判断:num1 < num2
386 num1 -le num2             # 数字判断:num1 <= num2
387 num1 -gt num2             # 数字判断:num1 > num2
388 num1 -ge num2             # 数字判断:num1 >= num2
389 
390 
391 ##############################################################################
392 # 分支控制:if 和经典 test,兼容 posix sh 的条件判断语句
393 ##############################################################################
394 
395 test {expression}         # 判断条件为真的话 test 程序返回0 否则非零
396 [ expression ]            # 判断条件为真的话返回0 否则非零
397 
398 test "abc" = "def"        # 查看返回值 echo $? 显示 1,因为条件为假
399 test "abc" != "def"       # 查看返回值 echo $? 显示 0,因为条件为真
400 
401 test -a /tmp; echo $?     # 调用 test 判断 /tmp 是否存在,并打印 test 的返回值
402 [ -a /tmp ]; echo $?      # 和上面完全等价,/tmp 肯定是存在的,所以输出是 0
403 
404 test cond && cmd1         # 判断条件为真时执行 cmd1
405 [ cond ] && cmd1          # 和上面完全等价
406 [ cond ] && cmd1 || cmd2  # 条件为真执行 cmd1 否则执行 cmd2
407 
408 # 判断 /etc/passwd 文件是否存在
409 # 经典的 if 语句就是判断后面的命令返回值为0的话,认为条件为真,否则为假
410 if test -e /etc/passwd; then
411     echo "alright it exists ... "
412 else
413     echo "it doesn't exist ... "
414 fi
415 
416 # 和上面完全等价,[ 是个和 test 一样的可执行程序,但最后一个参数必须为 ]
417 # 这个名字为 "[" 的可执行程序一般就在 /bin 或 /usr/bin 下面,比 test 优雅些
418 if [ -e /etc/passwd ]; then   
419     echo "alright it exists ... "
420 else
421     echo "it doesn't exist ... "
422 fi
423 
424 # 和上面两个完全等价,其实到 bash 时代 [ 已经是内部命令了,用 enable 可以看到
425 [ -e /etc/passwd ] && echo "alright it exists" || echo "it doesn't exist"
426 
427 # 判断变量的值
428 if [ "$varname" = "foo" ]; then
429     echo "this is foo"
430 elif [ "$varname" = "bar" ]; then
431     echo "this is bar"
432 else
433     echo "neither"
434 fi
435 
436 # 复杂条件判断,注意 || 和 && 是完全兼容 posix 的推荐写法
437 if [ $x -gt 10 ] && [ $x -lt 20 ]; then
438     echo "yes, between 10 and 20"
439 fi
440 
441 # 可以用 && 命令连接符来做和上面完全等价的事情
442 [ $x -gt 10 ] && [ $x -lt 20 ] && echo "yes, between 10 and 20"
443 
444 # 小括号和 -a -o 是 posix xsi 扩展写法,小括号是字面量,输入时前面要加反斜杆
445 if [ \( $x -gt 10 \) -a \( $x -lt 20 \) ]; then
446     echo "yes, between 10 and 20"
447 fi
448 
449 # 同样可以用 && 命令连接符来做和上面完全等价的事情
450 [ \( $x -gt 10 \) -a \( $x -lt 20 \) ] && echo "yes, between 10 and 20"
451 
452 
453 # 判断程序存在的话就执行
454 [ -x /bin/ls ] && /bin/ls -l
455 
456 # 如果不考虑兼容 posix sh 和 dash 这些的话,可用 bash 独有的 ((..)) 和 [[..]]:
457 https://www.ibm.com/developerworks/library/l-bash-test/index.html
458 
459 
460 ##############################################################################
461 # 流程控制:while / for / case / until 
462 ##############################################################################
463 
464 # while 循环
465 while condition; do
466     statements
467 done
468 
469 i=1
470 while [ $i -le 10 ]; do
471     echo $i; 
472     i=$(expr $i + 1)
473 done
474 
475 # for 循环:上面的 while 语句等价
476 for i in {1..10}; do
477     echo $i
478 done
479 
480 for name [in list]; do
481     statements
482 done
483 
484 # for 列举某目录下面的所有文件
485 for f in /home/*; do 
486     echo $f
487 done
488 
489 # bash 独有的 (( .. )) 语句,更接近 c 语言,但是不兼容 posix sh
490 for (( initialisation ; ending condition ; update )); do
491     statements
492 done
493 
494 # 和上面的写法等价
495 for ((i = 0; i < 10; i++)); do echo $i; done
496 
497 # case 判断
498 case expression in 
499     pattern1 )
500         statements ;;
501     pattern2 )
502         statements ;;
503     * )
504         otherwise ;;
505 esac
506 
507 # until 语句
508 until condition; do
509     statements
510 done
511 
512 # select 语句
513 select name [in list]; do
514   statements that can use $name
515 done
516 
517 
518 ##############################################################################
519 # 命令处理
520 ##############################################################################
521 
522 command ls                         # 忽略 alias 直接执行程序或者内建命令 ls
523 builtin cd                         # 忽略 alias 直接运行内建的 cd 命令
524 enable                             # 列出所有 bash 内置命令,或禁止某命令
525 help {builtin_command}             # 查看内置命令的帮助(仅限 bash 内置命令)
526 
527 eval $script                       # 对 script 变量中的字符串求值(执行)
528 
529 
530 ##############################################################################
531 # 输出/输入 重定向
532 ##############################################################################
533 
534 cmd1 | cmd2                        # 管道,cmd1 的标准输出接到 cmd2 的标准输入
535 < file                             # 将文件内容重定向为命令的标准输入
536 > file                             # 将命令的标准输出重定向到文件,会覆盖文件
537 >> file                            # 将命令的标准输出重定向到文件,追加不覆盖
538 >| file                            # 强制输出到文件,即便设置过:set -o noclobber
539 n>| file                           # 强制将文件描述符 n的输出重定向到文件
540 <> file                            # 同时使用该文件作为标准输入和标准输出
541 n<> file                           # 同时使用文件作为文件描述符 n 的输出和输入
542 n> file                            # 重定向文件描述符 n 的输出到文件
543 n< file                            # 重定向文件描述符 n 的输入为文件内容
544 n>&                                # 将标准输出 dup/合并 到文件描述符 n
545 n<&                                # 将标准输入 dump/合并 定向为描述符 n
546 n>&m                               # 文件描述符 n 被作为描述符 m 的副本,输出用
547 n<&m                               # 文件描述符 n 被作为描述符 m 的副本,输入用
548 &>file                             # 将标准输出和标准错误重定向到文件
549 <&-                                # 关闭标准输入
550 >&-                                # 关闭标准输出
551 n>&-                               # 关闭作为输出的文件描述符 n
552 n<&-                               # 关闭作为输入的文件描述符 n
553 diff <(cmd1) <(cmd2)               # 比较两个命令的输出
554 
555 
556 ##############################################################################
557 # 文本处理 - cut
558 ##############################################################################
559 
560 cut -c 1-16                        # 截取每行头16个字符
561 cut -c 1-16 file                   # 截取指定文件中每行头 16个字符
562 cut -c3-                           # 截取每行从第三个字符开始到行末的内容
563 cut -d':' -f5                      # 截取用冒号分隔的第五列内容
564 cut -d';' -f2,10                   # 截取用分号分隔的第二和第十列内容
565 cut -d' ' -f3-7                    # 截取空格分隔的三到七列
566 echo "hello" | cut -c1-3           # 显示 hel
567 echo "hello sir" | cut -d' ' -f2   # 显示 sir
568 ps | tr -s " " | cut -d " " -f 2,3,4  # cut 搭配 tr 压缩字符
569 
570 
571 ##############################################################################
572 # 文本处理 - awk / sed 
573 ##############################################################################
574 
575 awk '{print $5}' file              # 打印文件中以空格分隔的第五列
576 awk -f ',' '{print $5}' file       # 打印文件中以逗号分隔的第五列
577 awk '/str/ {print $2}' file        # 打印文件中包含 str 的所有行的第二列
578 awk -f ',' '{print $nf}' file      # 打印逗号分隔的文件中的每行最后一列 
579 awk '{s+=$1} end {print s}' file   # 计算所有第一列的合
580 awk 'nr%3==1' file                 # 从第一行开始,每隔三行打印一行
581 
582 sed 's/find/replace/' file         # 替换文件中首次出现的字符串并输出结果 
583 sed '10s/find/replace/' file       # 替换文件第 10 行内容
584 sed '10,20s/find/replace/' file    # 替换文件中 10-20 行内容
585 sed -r 's/regex/replace/g' file    # 替换文件中所有出现的字符串
586 sed -i 's/find/replace/g' file     # 替换文件中所有出现的字符并且覆盖文件
587 sed -i '/find/i\newline' file      # 在文件的匹配文本前插入行
588 sed -i '/find/a\newline' file      # 在文件的匹配文本后插入行
589 sed '/line/s/find/replace/' file   # 先搜索行特征再执行替换
590 sed -e 's/f/r/' -e 's/f/r' file    # 执行多次替换
591 sed 's#find#replace#' file         # 使用 # 替换 / 来避免 pattern 中有斜杆
592 sed -i -r 's/^\s+//g' file         # 删除文件每行头部空格
593 sed '/^$/d' file                   # 删除文件空行并打印
594 sed -i 's/\s\+$//' file            # 删除文件每行末尾多余空格
595 sed -n '2p' file                   # 打印文件第二行
596 sed -n '2,5p' file                 # 打印文件第二到第五行
597 
598 
599 ##############################################################################
600 # 排序 - sort
601 ##############################################################################
602 
603 sort file                          # 排序文件
604 sort -r file                       # 反向排序(降序)
605 sort -n file                       # 使用数字而不是字符串进行比较
606 sort -t: -k 3n /etc/passwd         # 按 passwd 文件的第三列进行排序
607 sort -u file                       # 去重排序
608 
609 
610 ##############################################################################
611 # 快速跳转 - https://github.com/rupa/z
612 ##############################################################################
613 
614 source /path/to/z.sh               # .bashrc 中初始化 z.sh
615 z                                  # 列出所有历史路径以及他们的权重
616 z foo                              # 跳到历史路径中匹配 foo 的权重最大的目录
617 z foo bar                          # 跳到历史路径中匹配 foo 和 bar 权重最大的目录
618 z -l foo                           # 列出所有历史路径中匹配 foo 的目录及权重
619 z -r foo                           # 按照最高访问次数优先进行匹配跳转
620 z -t foo                           # 按照最近访问优先进行匹配跳转
621 
622 
623 ##############################################################################
624 # 键盘绑定
625 ##############################################################################
626 
627 bind '"\eh":"\c-b"'                # 绑定 alt+h 为光标左移,同 ctrl+b / <left>
628 bind '"\el":"\c-f"'                # 绑定 alt+l 为光标右移,同 ctrl+f / <right>
629 bind '"\ej":"\c-n"'                # 绑定 alt+j 为下条历史,同 ctrl+n / <down>
630 bind '"\ek":"\c-p"'                # 绑定 alt+k 为上条历史,同 ctrl+p / <up>
631 bind '"\eh":"\eb"'                 # 绑定 alt+h 为光标左移一个单词,同 alt-b 
632 bind '"\el":"\ef"'                 # 绑定 alt+l 为光标右移一个单词,同 alt-f 
633 bind '"\ej":"\c-a"'                # 绑定 alt+j 为移动到行首,同 ctrl+a / <home>
634 bind '"\ek":"\c-e"'                # 绑定 alt+k 为移动到行末,同 ctrl+e / <end>
635 bind '"\e;":"ls -l\n"'             # 绑定 alt+; 为执行 ls -l 命令
636 
637 
638 ##############################################################################
639 # 网络管理:ip / ifconfig / nmap ...
640 ##############################################################################
641 
642 ip a                               # 显示所有网络地址,同 ip address
643 ip a show eth1                     # 显示网卡 ip 地址
644 ip a add 172.16.1.23/24 dev eth1   # 添加网卡 ip 地址
645 ip a del 172.16.1.23/24 dev eth1   # 删除网卡 ip 地址
646 ip link show dev eth0              # 显示网卡设备属性
647 ip link set eth1 up                # 激活网卡
648 ip link set eth1 down              # 关闭网卡
649 ip link set eth1 address {mac}     # 修改 mac 地址
650 ip neighbour                       # 查看 arp 缓存
651 ip route                           # 查看路由表
652 ip route add 10.1.0.0/24 via 10.0.0.253 dev eth0    # 添加静态路由
653 ip route del 10.1.0.0/24           # 删除静态路由
654 
655 ifconfig                           # 显示所有网卡和接口信息
656 ifconfig -a                        # 显示所有网卡(包括开机没启动的)信息
657 ifconfig eth0                      # 指定设备显示信息
658 ifconfig eth0 up                   # 激活网卡
659 ifconfig eth0 down                 # 关闭网卡
660 ifconfig eth0 192.168.120.56       # 给网卡配置 ip 地址
661 ifconfig eth0 10.0.0.8 netmask 255.255.255.0 up     # 配置 ip 并启动
662 ifconfig eth0 hw ether 00:aa:bb:cc:dd:ee            # 修改 mac 地址
663 
664 nmap 10.0.0.12                     # 扫描主机 1-1000 端口
665 nmap -p 1024-65535 10.0.0.12       # 扫描给定端口
666 nmap 10.0.0.0/24                   # 给定网段扫描局域网内所有主机
667 nmap -o -sv 10.0.0.12              # 探测主机服务和操作系统版本
668 
669 
670 ##############################################################################
671 # 有趣的命令
672 ##############################################################################
673 
674 man hier                           # 查看文件系统的结构和含义
675 man test                           # 查看 posix sh 的条件判断帮助
676 man ascii                          # 显示 ascii 表
677 getconf long_bit                   # 查看系统是 32 位还是 64 位
678 bind -p                            # 列出所有 bash 的快捷键
679 mount | column -t                  # 漂亮的列出当前加载的文件系统
680 curl ip.cn                         # 取得外网 ip 地址和服务商信息
681 disown -a && exit                  # 关闭所有后台任务并退出
682 cat /etc/issue                     # 查看 linux 发行版信息
683 lsof -i port:80                    # 哪个程序在使用 80 端口?
684 showkey -a                         # 取得按键的 ascii 码
685 svn diff | view -                  # 使用 vim 来显示带色彩的 diff 输出
686 mv filename.{old,new}              # 快速文件改名
687 time read                          # 使用 ctrl-d 停止,最简单的计时功能
688 cp file.txt{,.bak}                 # 快速备份文件
689 sudo touch /forcefsck              # 强制在下次重启时扫描磁盘
690 find ~ -mmin 60 -type f            # 查找 $home 目录中,60 分钟内修改过的文件
691 curl wttr.in/~beijing              # 查看北京的天气预报
692 echo ${ssh_client%% *}             # 取得你是从什么 ip 链接到当前主机上的
693 echo $[random%x+1]                 # 取得 1 到 x 之间的随机数
694 bind -x '"\c-l":ls -l'             # 设置 ctrl+l 为执行 ls -l 命令
695 find / -type f -size +5m           # 查找大于 5m 的文件
696 chmod --reference f1 f2            # 将 f2 的权限设置成 f1 一模一样的
697 curl -l cheat.sh                   # 速查表大全
698 
699 
700 ##############################################################################
701 # 常用技巧
702 ##############################################################################
703 
704 # 列出最常使用的命令
705 history | awk '{a[$2]++}end{for(i in a){print a[i] " " i}}' | sort -rn | head
706 
707 # 列出所有网络状态:established / time_wait / fin_wait1 / fin_wait2 
708 netstat -n | awk '/^tcp/ {++tt[$nf]} end {for (a in tt) print a, tt[a]}'
709 
710 # 通过 ssh 来 mount 文件系统
711 sshfs name@server:/path/to/folder /path/to/mount/point
712 
713 # 显示前十个运行的进程并按内存使用量排序
714 ps aux | sort -nk +4 | tail
715 
716 # 在右上角显示时钟
717 while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done&
718 
719 # 从网络上的压缩文件中解出一个文件来,并避免保存中间文件
720 wget -qo - "http://www.tarball.com/tarball.gz" | tar zxvf -
721 
722 # 性能测试:测试处理器性能
723 python -c "import test.pystone;print(test.pystone.pystones())"
724 
725 # 性能测试:测试内存带宽
726 dd if=/dev/zero of=/dev/null bs=1m count=32768
727 
728 # linux 下挂载一个 iso 文件
729 mount /path/to/file.iso /mnt/cdrom -oloop
730 
731 # 通过主机 a 直接 ssh 到主机 b
732 ssh -t hosta ssh hostb
733 
734 # 下载一个网站的所有图片
735 wget -r -l1 --no-parent -nh -nd -p/tmp -a".gif,.jpg" http://example.com/images
736 
737 # 快速创建项目目录
738 mkdir -p work/{project1,project2}/{src,bin,bak}
739 
740 # 按日期范围查找文件
741 find . -type f -newermt "2010-01-01" ! -newermt "2010-06-01"
742 
743 # 显示当前正在使用网络的进程
744 lsof -p -i -n | cut -f 1 -d " "| uniq | tail -n +2
745 
746 # vim 中保存一个没有权限的文件
747 :w !sudo tee > /dev/null %
748 
749 # 在 .bashrc / .bash_profile 中加载另外一个文件(比如你保存在 github 上的配置)
750 source ~/github/profiles/my_bash_init.sh
751 
752 # 反向代理:将外网主机(202.115.8.1)端口(8443)转发到内网主机 192.168.1.2:443
753 ssh -cqtnn -r 0.0.0.0:8443:192.168.1.2:443  user@202.115.8.1
754 
755 # 正向代理:将本地主机的 8443 端口,通过 192.168.1.3 转发到 192.168.1.2:443 
756 ssh -cqtnn -l 0.0.0.0:8443:192.168.1.2:443  user@192.168.1.3
757 
758 # socks5 代理:把本地 1080 端口的 socks5 的代理请求通过远程主机转发出去
759 ssh -cqtnn -d localhost:1080  user@202.115.8.1
760 
761 # 终端下正确设置 alt 键和 backspace 键
762 http://www.skywind.me/blog/archives/2021
763 
764 
765 ##############################################################################
766 # 有用的函数
767 ##############################################################################
768 
769 # 自动解压:判断文件后缀名并调用相应解压命令
770 function q-extract() {
771     if [ -f $1 ] ; then
772         case $1 in
773         *.tar.bz2)   tar -xvjf $1    ;;
774         *.tar.gz)    tar -xvzf $1    ;;
775         *.tar.xz)    tar -xvjf $1    ;;
776         *.bz2)       bunzip2 $1     ;;
777         *.rar)       rar x $1       ;;
778         *.gz)        gunzip $1      ;;
779         *.tar)       tar -xvf $1     ;;
780         *.tbz2)      tar -xvjf $1    ;;
781         *.tgz)       tar -xvzf $1    ;;
782         *.zip)       unzip $1       ;;
783         *.z)         uncompress $1  ;;
784         *.7z)        7z x $1        ;;
785         *)           echo "don't know how to extract '$1'..." ;;
786         esac
787     else
788         echo "'$1' is not a valid file!"
789     fi
790 }
791 
792 # 自动压缩:判断后缀名并调用相应压缩程序
793 function q-compress() {
794     if [ -n "$1" ] ; then
795         file=$1
796         case $file in
797         *.tar) shift && tar -cf $file $* ;;
798         *.tar.bz2) shift && tar -cjf $file $* ;;
799         *.tar.xz) shift && tar -cjf $file $* ;;
800         *.tar.gz) shift && tar -czf $file $* ;;
801         *.tgz) shift && tar -czf $file $* ;;
802         *.zip) shift && zip $file $* ;;
803         *.rar) shift && rar $file $* ;;
804         esac
805     else
806         echo "usage: q-compress <foo.tar.gz> ./foo ./bar"
807     fi
808 }
809 
810 # 漂亮的带语法高亮的 color cat ,需要先 pip install pygments
811 function ccat() {
812     local style="monokai"
813     if [ $# -eq 0 ]; then
814         pygmentize -p style=$style -p tabsize=4 -f terminal256 -g
815     else
816         for name in $@; do
817             pygmentize -p style=$style -p tabsize=4 -f terminal256 -g "$name"
818         done
819     fi
820 }
821 
822 
823 ##############################################################################
824 # 好玩的配置
825 ##############################################################################
826 
827 # 放到你的 ~/.bashrc 配置文件中,给 man 增加漂亮的色彩高亮
828 export less_termcap_mb=$'\e[1m\e[32m'
829 export less_termcap_mh=$'\e[2m'
830 export less_termcap_mr=$'\e[7m'
831 export less_termcap_md=$'\e[1m\e[36m'
832 export less_termcap_zw=""
833 export less_termcap_us=$'\e[4m\e[1m\e[37m'
834 export less_termcap_me=$'\e(b\e[m'
835 export less_termcap_ue=$'\e[24m\e(b\e[m'
836 export less_termcap_zo=""
837 export less_termcap_zn=""
838 export less_termcap_se=$'\e[27m\e(b\e[m'
839 export less_termcap_zv=""
840 export less_termcap_so=$'\e[1m\e[33m\e[44m'
841 
842 # alt+hjkl/hjkl 快速移动光标,将下面内容添加到 ~/.inputrc 中可作用所有工具,
843 # 包括 bash/zsh/python/lua 等使用 readline 的工具,帮助见:info rluserman
844 "\eh": backward-char
845 "\el": forward-char
846 "\ej": next-history
847 "\ek": previous-history
848 "\eh": backward-word
849 "\el": forward-word
850 "\ej": beginning-of-line
851 "\ek": end-of-line
852 
853 
854 ##############################################################################
855 # references
856 ##############################################################################
857 
858 https://github.com/idnan/bash-guide
859 http://www.linuxstall.com/linux-command-line-tips-that-every-linux-user-should-know/
860 https://ss64.com/bash/syntax-keyboard.html
861 http://wiki.bash-hackers.org/commands/classictest
862 https://www.ibm.com/developerworks/library/l-bash-test/index.html
863 https://www.cyberciti.biz/faq/bash-loop-over-file/
864 https://linuxconfig.org/bash-scripting-tutorial
865 https://github.com/lecoupa/awesome-cheatsheets/blob/master/languages/bash.sh
866 https://devhints.io/bash
867 https://github.com/jlevy/the-art-of-command-line
868 https://yq.aliyun.com/articles/68541
869 
870 # vim: set ts=4 sw=4 tw=0 et :