主要记录一些Bash及Bash脚本的技巧,方便快速查阅。不定期更新。。。。。。
Bash命令行快捷键
- Ctrl + a:移到行首
- Ctrl + e:移到行尾
- Ctrl + f:按字符向右移
- Ctrl + b:按字符向左移
- Ctrl + u:光标处删除至行首
- Ctrl + k:光标处删除至行尾
- Ctrl + w:光标处删除至单词字首
- Ctrl + h:删除光标前的字符(相当于Backspace键)
- Ctrl + r:逆向搜索历史命令记录
- Ctrl + p:历史命令中上一条
- Ctrl + n:历史命令中下一条
- Ctrl + l:清屏
- Ctrl + z:挂起命令
- Alt + .:上一命令的最后一个参数
- Alt + f:按单词向右移
- Alt + b:按单词向左移
- !!:执行上一条命令
echo
echo忽略换行符
1
2#\n无效
echo -n "echo_test\n"echo字符串转义
1
2#转义\t
echo -e '0\t1\t2'echo终端颜色
echo -e “\033[光标;前景;背景m 你要显示的内容 \033[0m”
例子:echo -e “\033[0;30;41m It’s cool \033[0m”1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18光标代码 意义
0 OFF
1 高亮显示(粗体)
2 亮度减半
4 下划线
5 闪烁
7 反白显示
8 不可见
前景 背景 颜色
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色echo终端颜色汇总

变量
特殊变量
- $* 所有的位置参数的字符串(所有位置参数为一个整体的字符串)
- $@ 所有的位置参数的列表(每个位置参数为单独个体)
- $# 位置参数的数量
- $0 当前脚本的路径
- $$ 当前进程的PID
- $? 上一个命令的退出码
- $_ 上一个命令的最后一个参数
- $! 上一运行的后台进程的PID
- $- 当前的option flags
变量判断
| 表达式 | 解释 | |||
|---|---|---|---|---|
| ${ #var} | var字符串长度 |
|||
| ${var-default}/${var=default} | 若var不存在则值为=default |
|||
| ${var:-default}/${var:=default} | 当var空或不存在时值为default |
|||
| ${var+default} | 若var存在则值为default |
|||
| ${var:+default} | 当var存在或空时则值为default |
|||
| ${var?message} | 若var不存在则打印message信息并以exit 1 |
|||
| ${var:?message} | 当var不存在或空则打印message信息并以exit 1 |
变量删除
| 表达式 | 解释 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
| ${var#pattern} | 从var左边开始删除最小匹配pattern的字符串 |
var='/usr/bin/vim' ${var#/*/} bin/vim |
||||||
| ${var##pattern} | 从var左边开始删除最长匹配pattern的字符串 |
var='/usr/bin/vim' ${var#/*/} vim |
||||||
| ${var%pattern} | 从var右边开始删除最小匹配pattern的字符串 |
|||||||
| ${var%%pattern} | 从var右边开始删除最长匹配pattern的字符串 |
变量截取
Bash变量的位置从0开始标记,abc——>a(0)b(1)c(2)
| 表达式 | 解释 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
| ${var:pos} | 在var中截取从位置pos开始到最后的字符串(包含pos) |
var='12345' ${var:4} 5 (从位置为4开始截取[包括位置4]) |
||||||
| ${var:pos:len} | 在var中截取从位置pos开始截取长度为len的字符串(包含pos) |
var='12345' ${var:1:3} 234 (从位置1开始截取长度为3的字符串[包含位置1]) |
变量替换
| 表达式 | 解释 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
| ${var/pattern/replace} | 从var中最长匹配pattern并用replace将其替换(仅替换第一次出现的pattern) |
var='123_test_456_test' ${var/test/replace} 123_replace_456_test |
||||||
| ${var//pattern/replace} | 从var中最长匹配pattern并用replace将其全部替换 |
var='123_test_456_test' ${var//test/replace} 123_replace_456_replace |
普通数组及关联数组
普通数组
创建
1
2
3array=(one two three four five)
array[0]="one"、array[1]="two" ......获取数值
获取具体元素数值
1
echo ${array[0]}
获取所有元素数值
1
echo ${array[@]} / echo ${array[*]}
获取数组长度
1
echo ${#array[@]}
获取索引
1
echo ${!array[@]}
关联数组
关联数组需要Bash版本高于4.0才支持
创建
1
2declare -A as_array
as_array=([index0]=one [index1]=two [index2]=three [index3]=four)获取数值
获取具体元素数值
1
echo ${as_array[index0]}
获取所有元素数值
1
echo ${as_array[@]} / echo ${as_array[*]}
获取数组长度
1
echo ${#as_array[@]}
获取索引
1
echo ${!as_array[@]}
Alias
alias接收命令行参数
alias设置别名命令时是无法通过命令行接收参数的,但可以通过构建函数实现此功能1
alias psg='psg(){ ps aux|grep "$1"; };psg'
alias中
''内引用''
转义——‘\’’1
alias xgrep='awk -F":" '\''{print \$1}'\'' '
消除alias
在命令行中,有时想要不使用alias别名命令而是使用原生命令,可强制取消alias别名命令1
\rm file_name
进程替换
进程替换(>(command) <(command))和命令替换($())类似,将一个进程的输出转给另一个进程
使用进程替换需要Bash支持,进程替换是非POSIX兼容的。使用了进程替换的脚本需要用bash script_name.sh而不能用sh script_name.sh执行。尽管/bin/sh是/bin/bash的软链接,当使用sh执行脚本时,就会启用POSIX兼容,进程替换是非POSIX兼容的。1
read SSH_HOST SSH_USER SSH_PWD SSH_PORT< <(echo "$eachLine"|awk '{print $1,$2,$3,$4}')
Dig
dig命令主要用于查询DNS相关内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 域名解析
$> dig www.google.com
# 指定域名服务器查询
$> dig www.google.com @ns1.dnspod.net
# 指定查询类型
$> dig -t mx gmail.com
# 反向查询
$> dig -x 216.58.221.100
# 使用TCP方式查询
$> dig +tcp www.google.com
# 追踪dig查询过程
$> dig +trace www.google.com
# 精简dig结果
$> dig +short www.google.com
dd
生成指定大小文件1
dd if=/dev/zero of=test.img bs=1M count=1000
if:输入文件of:输出文件bs:块大小c:字节(1B)w:字(2B)b:块(512B)k:千字节(1024B)M:兆字节(1024KB)G:吉字节(1024MB)
count:块数
curl
保存页面
1
curl -o google.html http://www.google.com
静默输出
不输出错误消息及执行过程1
curl -s http://www.google.com
POST JSON数据
-X——指定方法
-H——指定HTTP HEADER
-d——指定数据1
curl -X POST -H "Content-Type: application/json" -d '{"status":500,"msg":"fail","code":'$CODE',"appid":"'$APPID'","reqCode":"'$REQCODE'"}' http://example.com/api
跟踪重定向
1
curl -L http://example.com
获取HTTP HEADER
1
curl -I http://example.com
认证
1
curl -u username:passowrd http://example.com
route
1 | # 显示路由表 |
rsync
rsync拉取同步
1
/usr/bin/rsync -azv --delete rsync_user@rsync_ip::rsync_module /path/to/dest_dir/ --password-file=/path/to/password.file
--delete
将目标处多余的删除,既使得目标与源的文件完全一致,慎用此参数。-a
归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD-z
对备份的文件在传输时进行压缩处理-v
详细模式输出-n
查看哪些文件将被传输,并非实际传输,即--dry-run
rsync推送同步
1
/usr/bin/rsync -azv --delete /path/to/source_dir/ rsync_user@rsync_ip::rsync_module --password-file=/path/to/password.file
排除目录
1
/usr/bin/rsync -azv --delete --exclude='/paht/to/exclude_dir1/' --exclude='/path/to/exclude_dir2/' rsync_user@rsync_ip::rsync_module /path/to/dest_dir/ --password-file=/path/to/password.file
rsync断点续传
让rsync使用ssh协议,代替scp并实现断点续传功能1
rsync -P --rsh='ssh -p2222' ssh_user@ssh_ip:file_name.tar.gz /tmp
rsync过滤规则
指定rsync只同步某类型文件并保持文件所在的目录结构1
2
3
4
5
6
7
8
9
10
11
12
13
14# 只同步jpg文件(递归同步,即子目录下的所有jpg文件也同步)(-! */ 匹配所有非目录文件)
/usr/bin/rsync -azv --include="*.jpg" --filter="-! */" appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd
# 只同步jpg、png文件(递归同步,即子目录下的所有jpg、png文件也同步)
/usr/bin/rsync -azv -f '+ *.jpg' -f '+ *.png' -f '+ */' -f '- *' appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd
# 只同步jpg文件(递归同步,即子目录下的所有jpg文件也同步)
/usr/bin/rsync -azv --include="*.jpg" --include="*.png" --include="*/" --exclude="*" appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd
# 只同步jpg文件(非递归同步,仅仅同步该目录的jpg文件,目录下的子目录不会同步也不会创建)
/usr/bin/rsync -azv --include="*.jpg" --exclude="*" appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd
# 只同步jpg文件(非递归同步,仅仅同步该目录的jpg文件,目录下的子目录不会同步也不会创建)
/usr/bin/rsync -azv -f '+ *.jpg' -f '+ *.png' -f '- *' appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd
grep
1 | #利用grep提取IP地址 |
sed
1 | #在State所在行前添加一行空白行 |
awk
1 | #awk去除重复行 |