主要记录一些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去除重复行 |