Skip to content

Latest commit

 

History

History
393 lines (294 loc) · 12.1 KB

shell.md

File metadata and controls

393 lines (294 loc) · 12.1 KB

🐌 Shell相关脚本

Shell使用加强

🍺 c

原样命令行输出,并拷贝标准输出到系统剪贴板,省去CTRL+CCTRL+V操作。支持LinuxMacWindowscygwinMSSYS)。

命令名c意思是Copy,因为这个命令我平时非常常用,所以使用一个字符的命令名,方便键入。

更多说明参见拷贝复制命令行输出放在系统剪贴板上

示例

有3种使用风格,根据需要或是你的偏好选取。

# 1. 前缀方式,后面跟上要运行的命令
$ c pwd
/Users/jerry
$ c echo -e 'a\nb'
a
b
# 这种使用方式,后面跟的命令不能是别名(alias),对于别名可以用下面的使用方式。

# 2. 后缀方式,管道
$ echo -e 'a\nb' | nl | c
1   a
2   b
# gb是oh-my-zsh的别名,列出git的分支,需要后缀的方式的使用。
$ gb | c

# 3. 从标准输入读取内容。拷贝文件内容时这种方式最直接。
$ c < id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAz+ETZEgoLeIiC0rjWewdDs0sbo8c...== [email protected]

参考资料

拷贝复制命令行输出放在系统剪贴板上,给出了不同系统可用命令。

🍺 colines

彩色cat出文件行,方便人眼区分不同的行。

命令名colines意思是COLorful LINES

示例

$ echo a | colines
a
$ echo -e 'a\nb' | colines
a
b
$ echo -e 'a\nb' | nl | colines
1   a
2   b
$ colines file1 file2.txt
================================================================================
file1
================================================================================
file1 line1
file1 line2
================================================================================
file2.txt
================================================================================
file2 line1
file2 line2

注:上面显示中,没有彩色,在控制台上运行可以看出彩色效果。

🍺 a2l

按行彩色输出参数,方便人眼查看。

命令名a2l意思是Arguments to(2) Lines

示例

$ a2l *.java
A.java
B.java
...

# zsh支持 **/* 跨目录glob,可以方便搜索,但是输出内容是空格分隔的不方便查看。
# 把参数按行输出方便查看 或是 grep
$ a2l **/*.sh
swtrunk.sh
tcp-connection-state-counter.sh
test-cases/parseOpts-test.sh
test-cases/self-installer.sh
...

注:上面显示中,没有彩色,在控制台上运行可以看出彩色效果。

🍺 ap and rp

批量转换文件路径为绝对路径/相对路径,会自动跟踪链接并规范化路径。

命令名ap意思是Absolute PathrpRelative Path

示例

# ap缺省打印当前路径的绝对路径
$ ap
/home/admin/useful-scripts/test
$ ap ..
/home/admin/useful-scripts
# 支持多个参数
$ ap .. ../.. /etc /etc/../etc
/home/admin/useful-scripts
/home/admin
/etc
/etc

# rp当一个参数时,打印相对于当前路径的相对路径
$ rp /home
../..
# 多于一个参数时,打印相对于最后一个参数的相对路径
$ rp /home /etc/../etc /home/admin
..
../../etc

🍺 xpl and xpf

在命令行中快速完成 在文件浏览器中 打开/选中 指定的文件或文件夹的操作。

  • xpl:在文件浏览器中打开指定的文件或文件夹。
    # xplexplorer的缩写。
  • xpf: 在文件浏览器中打开指定的文件或文件夹,并选中。
    # xpfexplorer and select file的缩写。

用法

xpl
# 缺省打开当前目录
xpl <文件或是目录>...
# 打开多个文件或目录

xpf
# 缺省打开当前目录
xpf <文件或是目录>...
# 打开多个文件或目录

示例

xpl /path/to/dir
xpl /path/to/foo.txt
xpl /path/to/dir1 /path/to/foo1.txt
xpf /path/to/foo1.txt
xpf /path/to/dir1 /path/to/foo1.txt

贡献者

Linhua Tan修复Linux的选定Bug。

统计各个TCP连接状态的个数。

NginxApache的机器上需要查看,TCP连接的个数,以判定

  • 连接数、负荷
  • 是否有攻击,查看SYN_RECV数(SYN攻击)
  • TIME_WAIT数,太多会导致TCP: time wait bucket table overflow

用法

tcp-connection-state-counter.sh

示例

$ tcp-connection-state-counter.sh
ESTABLISHED  290
TIME_WAIT    212
SYN_SENT     17

Shell开发/测试加强

在编写脚本时,常常要确认输入参数是否是期望的:参数个数,参数值(可能包含有人眼不容易发现的空格问题)。

这个脚本输出脚本收到的参数。在控制台运行时,把参数值括起的括号显示成 红色,方便人眼查看。

示例

$ ./echo-args.sh 1 "  2 foo  " "3        3"
0/3: [./echo-args.sh]
1/3: [1]
2/3: [  2 foo  ]
3/3: [3        3]

使用方式

需要查看某个脚本(实际上也可以是其它的可执行程序)输出参数时,可以这么做:

  • 把要查看脚本重命名。
  • 建一个echo-args.sh脚本的符号链接到要查看参数的脚本的位置,名字和查看脚本一样。

这样可以不改其它的程序,查看到输入参数的信息。

显示Terminator的全部文字彩色组合的效果及其打印方式。

脚本中,也给出了colorEchocolorEchoWithoutNewLine函数更方便输出彩色文本,用法:

colorEcho <颜色样式> <要输出的文本>...
colorEchoWithoutNewLine  <颜色样式> <要输出的文本>...
# 输出红色文本
colorEcho "0;31;40" "Hello world!"
# 输出黄色带下划线的文本
colorEchoWithoutNewLine "4;33;40" "Hello world!" "Hello Hell!"

console-text-color-themes.sh的运行效果图如下:
console-text-color-themes.sh的运行效果图

贡献者

姜太公提供循环输出彩色组合的脚本。

参考资料

提供命令行选项解析函数parseOpts,以加强支持选项的值有多个值(即数组)。
# 自己写一个命令行选项解析函数,是因为bashbuildin命令getopts和加强版本命令getopt都不支持数组的值。

指定选项的多个值(即数组)的风格模仿find命令的-exec选项:

$ find . -name \*.txt -exec echo "find file: " {} \;
find file: foo.txt
find file: bar.txt
...

用法

parseOpts函数的第一个参数是要解析的选项说明,后面跟实际要解析的输入参数。

选项说明可以长选项和短选项,用逗号分隔,如a,a-long。不同选项的说明间用竖号分隔,如a,a-long|b,b-long:

选项说明最后可以有选项类型说明:

  • -: 无参数的选项。即有选项则把值设置成true。这是 缺省 的类型。
  • :: 有参数的选项,值只有一个。
  • +: 有多个参数值的选项。值列表要以;表示结束。
    注意,;Bash的元字符(用于一行中多个命令分隔),所以加上转义写成\;(当然也可以按你的喜好写成";"';')。

实际要解析的输入参数往往是你的脚本参数,这样parseOpts函数调用一般是:

parseOpts "a,a-long|b,b-long:|c,c-long+" "$@"
# "$@" 即是回放你的脚本参数

通过约定的全局变量来获取选项和参数:

  • 选项名为a,通过全局变量_OPT_VALUE_a来获取选项的值。
  • 选项名为a-long,通过全局变量_OPT_VALUE_a_long来获取选项的值。
    即,把选项名的-_,再加上前缀_OPT_VALUE_对应的全局变量来获得选项值。
  • 除了选项剩下的参数,通过全局变量_OPT_ARGS来获取。

按照惯例,输入参数中如果有--表示之后参数中不再有选项,即之后都是参数。

示例

# 导入parseOpts.sh
source /path/to/parseOpts.sh

parseOpts "a,a-long|b,b-long:|c,c-long+" -a -b bv --c-long c.sh -p pv -q qv arg1 \; aa bb cc
# 可以通过下面全局变量来获得解析的参数值:
#    _OPT_VALUE_a = true
#    _OPT_VALUE_a_long = true
#    _OPT_VALUE_b = bv
#    _OPT_VALUE_b_long = bv
#    _OPT_VALUE_c = (c.sh -p pv -q qv arg1) ,数组类型
#    _OPT_VALUE_c_long = (c.sh -p pv -q qv arg1) ,数组类型
#    _OPT_ARGS = (aa bb cc) ,数组类型

--的使用效果示例:

# 导入parseOpts.sh
source /path/to/parseOpts.sh

parseOpts "a,a-long|b,b-long:|c,c-long+" -a -b bv -- --c-long c.sh -p pv -q qv arg1 \; aa bb cc
# 可以通过下面全局变量来获得解析的参数值:
#    _OPT_VALUE_a = true
#    _OPT_VALUE_a_long = true
#    _OPT_VALUE_b = bv
#    _OPT_VALUE_b_long = bv
#    _OPT_VALUE_c 没有设置过
#    _OPT_VALUE_c_long 没有设置过
#    _OPT_ARGS = (--c-long c.sh -p pv -q qv arg1 ';' aa bb cc) ,数组类型

兼容性

这个脚本比较复杂,测试过的环境有:

  1. bash --version
    GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
    uname -a
    Linux foo-host 2.6.32-41-generic #94-Ubuntu SMP Fri Jul 6 18:00:34 UTC 2012 x86_64 GNU/Linux
  2. bash --version
    GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin14)
    uname -a
    Darwin foo-host 14.0.0 Darwin Kernel Version 14.0.0: Fri Sep 19 00:26:44 PDT 2014; root:xnu-2782.1.97~2/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin
  3. bash --version
    GNU bash, version 3.00.15(1)-release (i386-redhat-linux-gnu)
    uname -a
    Linux foo-host 2.6.9-103.ELxenU #1 SMP Wed Mar 14 16:31:15 CST 2012 i686 i686 i386 GNU/Linux

贡献者

Khotyn Huang指出bash 3.0下使用有问题,并提供bash 3.0的测试机器。