shell关联数组基本用法

:bash自版本4后才开始支持关联数组,之前的版本可以考虑通过二维数组来代替。

一、基本用法

1. 数组声明

1
declare -a arr

2. 数组赋值

静态赋值

1
arr=([A]=A1, [C]=C2, [E]=E3, [B]=B411, [b]=b5)

动态赋值

1
2
3
4
5
arr["A"]=A1
arr["C"]=C2
arr["E"]=E3
arr["B"]=B411
arr["b"]=b5

3. 数组遍历

数组索引(键)

格式:${!arr[@]}${!arr[*]}

数组内容(值)

格式:${arr[@]}${arr[*]}

4. 数组长度

格式:

1
${#变量}

该变量若为数组,则为数组长度;若为普通变量,则为普通变量长度。

数组长度:

1
2
${#arr[@]}
${#arr[*]}

数组元素长度:

1
${#arr[2]}

5. 子数组

格式:

1
${#arr:index:end}

升级mac bash到4.3版本

升级mac bash到4.3版本

一、前言

MAC OS版本:OS X Yosemite 10.10.5

经查看bash版本发现,默认的bash版本为:3.2.57(1)-release

1
2
3
yerba-buena:~ yeshaoting$ /bin/bash -version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14)
Copyright (C) 2007 Free Software Foundation, Inc.

二、版本升级

借助mac下的命令行安装工具brew安装bash。

方式1:brew安装

1
2
3
4
5
yerba-buena:article yeshaoting$ brew install bash
==> Installing dependencies for bash: readline
==> Installing bash dependency: readline
==> Downloading https://homebrew.bintray.com/bottles/readline-6.3.8.yosemite.bottle.tar.gz
……

方式2:自行编译安装

bash下载地址:http://ftp.gnu.org/gnu/bash/

1
2
3
4
5
6
wget http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz
tar zxvf bash-4.2.tar.gz
cd bash-4.2
./configure
make
make install

三、版本替换

1. 替换bash

1
2
yerba-buena:~ yeshaoting$ sudo mv /bin/bash /bin/bash.origin
yerba-buena:~ yeshaoting$ sudo ln -s /usr/local/opt/bash/bin/bash /bin/bash

由于本mac版本下的sh并不是直接链接bash,而是bash的一个文件拷贝。因此,还要替换默认的sh指向的命令为bash,如下:

1
2
yerba-buena:~ yeshaoting$ sudo mv /bin/sh /bin/sh.origin
yerba-buena:~ yeshaoting$ sudo ln -s /usr/local/opt/bash/bin/bash /bin/sh

2. 验证

通过bash和sh命令查看版本:

1
2
3
4
5
6
7
yerba-buena:~ yeshaoting$ bash -version
GNU bash,版本 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
Copyright (C) 2013 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证第三版或者更新版本 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

通过BASH_VERSION变更查看版本:

1
2
yerba-buena:~ yeshaoting$ echo $BASH_VERSION
4.3.42(1)-release

四、重要特性

关联数组从bash 4.0开始被引入,关联数组的索引值可以使用任意的文本。

五、参考文档

  1. 升级Mountain Lion的bash到4.2版本
  2. [Shell学习笔记] 数组、关联数组和别名使用
  3. shell升级,Linux系统升级bash
  4. MAC系统默认命令行环境BASH版本升级修改

打造个人专属Sublime Text 3

一、前言

1. 下载与破解

当前可用的破解码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
—– BEGIN LICENSE —–
Andrew Weber
Single User License
EA7E-855605
813A03DD 5E4AD9E6 6C0EEB94 BC99798F
942194A6 02396E98 E62C9979 4BB979FE
91424C9D A45400BF F6747D88 2FB88078
90F5CC94 1CDC92DC 8457107A F151657B
1D22E383 A997F016 42397640 33F41CFC
E1D0AE85 A0BBD039 0E9C8D55 E1B89D5D
5CDB7036 E56DE1C0 EFCC0840 650CD3A6
B98FC99C 8FAC73EE D2B95564 DF450523
—— END LICENSE ——

参见:

2. Sublime Text 2与Sublime Text 3区别

简单的说:

  • ST3支持在项目目录里面寻找变量提供了
  • 对标签页更好地支持(更多的命令和快捷键)
  • 加快了程序运行的速度
  • 更新了API,使用Python3.3

参见:

二、配置

1. 我的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"ignored_packages":
[
"Vintage"
],

// 字体
"font_size": 12,

// 高亮当前行
"highlight_line": true,

// 新标签页打开文件
"preview_on_click": false,

//滚动能否超过结尾
"scroll_past_end": false,

// TAB缩进宽度
"tab_size": 4,

// 自动转换TAB为空格
"translate_tabs_to_spaces": false,

// 皮肤
"theme": "Soda Dark 3.sublime-theme",

// 关闭自动更新
"update_check": false,

// 自动换行
"word_wrap": "true"
}

2. 关闭自动更新

SublimeText的升级挺快的,每次升级完之后都要重新破解一次主文件,不用重新注册,如果嫌更新太麻烦可以在用户配置中加入如下配置禁用自动更新:

1
"update_check": false

3. soda主题

参见:https://github.com/buymeasoda/soda-theme/

通过package controller安装Theme - Soda。

4. 记住打开的文件

1
"remember_open_files": false

Linux命令小记

一、awk命令

1. 删除重复的、非连续的行

1
`awk '! a[$0]++'`

2. awk使用特殊分隔符分隔列

1
echo "192.168.102.134" | awk -F . '{print $4}'

二、sed命令

1. 截取程序日志中某个时间范围内的文本

1
sed -n '/^2015-05-14 15:32:30/,/^2015-05-14 16:12:09/p' access_log > log.txt

2. 去除空白行的sed

1
SECRET=`sed '/^$/d' file.txt | head -1`

3. 通过sed替换字特殊字符

echo "12,34,56" | sed 's/,/ /g'

4. 通过sed替换二者之间的字符串内容

文本内容:

1
2
<server   id="film-web"   address="127.0.0.1" port="6881">
</server>
1
2
sed -n "s/\( *server.*port=\"\).*\(\".*\)/\1abc\2/p" 1.txt
sed -n "s/\( *server.*address=\"\).*\(\" *port\)/\1abc\2/p" 1.txt

:sed里,使用圆括号括起来的内容,可以看做是变量。使用\1和\2来输出。
参见http://coolshell.cn/articles/9104.html 圆括号匹配

5. 从替换开始匹配行到行尾或结束匹配行区间内替换内容

1
2
sed -i "/ *server *id=/,\${s/\(\<watchdog-port>\).*\(<\/watchdog-port>\)/\18000\2/g;}" resin.conf
sed "/ *server *id=\"/,/<\/server>/{s/\(\<watchdog-port>\).*\(<\/watchdog-port>\)/\18888\2/g;}" resin.conf

:每个匹配前后都需要加/,见上面红色部分。$表示最后一行,不需要加/

三、grep命令

1. 查找特定文件指定字符串

grep "no object DCH for MIME type multipart/mixed" *.log > MIME.log

2. 查找文本内容

grep -i -r --exclude=*.jar --exclude=*.log* noah .

3. 查看tomcat日志特定内容

tail -f catalina.out | grep timecost | grep FamilyController | awk '{if($10 > 100) print $0}'

4. 查看tomcat某天日志

tail -800000 catalina.out | grep 2014-06-30 > 2014-06-30.log

5. 记录统计

1
2
grep timecost file.txt | wc -l
ls | wc -l

6. grep与或非

与操作

1
2
3
grep -E 'pattern1.*pattern2' file.txt # in that order
grep -E 'pattern1.*pattern2|pattern2.*pattern1' file.txt # in any order
grep 'pattern1' file.txt | grep 'pattern2' # in any order

或操作

1
2
3
4
grep "pattern1\|pattern2" file.txt
grep -E "pattern1|pattern2" file.txt
grep -e pattern1 -e pattern2 file.txt
egrep "pattern1|pattern2" file.txt

非操作

1
grep -v 'pattern1' file.txt

摘自:Using BASH “Grep OR / Grep AND / Grep NOT” Operators

7. 递归查询不包含指定内容的文件

1
grep -irL "date:" file.txt

Mac装机软件

Mac icon

一、应用软件

二、命令工具

1. cloc

cloc(Count Lines of Code),一款代码行统计工具。

命令安装

1
2
3
4
5
6
7
8
9
npm install -g cloc                    # https://www.npmjs.com/package/cloc
sudo apt-get install cloc # Debian, Ubuntu
sudo yum install cloc # Red Hat, Fedora
sudo dnf install cloc # Fedora 22 or later
sudo pacman -S cloc # Arch
sudo pkg install cloc # FreeBSD
sudo port install cloc # Mac OS X with MacPorts
brew install cloc # Mac OS X with Homebrew
choco install cloc # Windows with Chocolatey

效果展示

顺便统计了某个项目目录下的代码行,效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
yerba-buena:java yeshaoting$ cloc ./
205 text files.
163 unique files.
69 files ignored.

github.com/AlDanial/cloc v 1.70 T=1.05 s (130.4 files/s, 7699.2 lines/s)
----------------------------------------------------------------------------------------
Language files blank comment code
----------------------------------------------------------------------------------------
XML 105 87 521 5983
Maven 1 35 9 357
JavaScript 1 29 15 332
Java 6 63 8 199
HTML 6 6 0 105
Markdown 1 35 0 88
Freemarker Template 2 2 0 41
Velocity Template Language 2 2 0 38
JSP 3 0 0 37
Mustache 4 0 0 32
Twig 3 1 0 31
Handlebars 2 0 0 22
YAML 1 0 0 8
----------------------------------------------------------------------------------------
SUM: 137 260 553 7273
----------------------------------------------------------------------------------------

参见:https://github.com/AlDanial/cloc

2. tree

命令行输出文件树形结构

安装

1
brew install tree

效果

1
2
3
4
5
6
7
8
9
10
yerba-buena:examples yeshaoting$ tree
.
├── InMemoryPresentationsRepository.java
├── PresentationsRepository.java
├── controller
│   └── PresentationsController.java
├── model
│   └── Presentation.java
└── services
└── PresentationsService.java

3. wget

4. sqlmap

5. mycli

6. cheat

7. innotop

8. Mac OSX Copy and Paste Commands

Command Function
pbcopy Copy to Clipboard
pbpaste Paste from Clipboard

参见:Copy to and Paste From the Clipboard on the Mac OSX Command Line

9. SHC

Shell script compiler

参见:https://neurobin.org/projects/softwares/unix/shc/

10. Oraji

参见:https://neurobin.org/projects/softwares/unix/oraji/

11. qshell

https://github.com/qiniu/qshell

http://developer.qiniu.com/code/v6/tool/qshell.html

三、下载网站

brew命令下载:http://brewformulas.org/

自定义taglib

一、扩展函数库

在taglib函数类中添加需要的函数randomElement、join等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* @description JSTL function ext
*
* @author yeshaoting
* @date 2015-06-29 14:52:57
*/
public class FunctionsExt extends Functions {

/**
* <pre>
* jstl's fn:join only works with String[]. This one is more general.
*
* usage: ${nc:join(values, ", ")}
* @see http://stackoverflow.com/questions/3886211/taglib-in-java-tag-with-array-parameter
* </pre>
*/
public static String join(Object values, String seperator) {
if (values == null)
return StringUtils.EMPTY;
if (values instanceof Collection<?>)
return StringUtils.join((Collection<?>) values, seperator);
else if (values instanceof Object[])
return StringUtils.join((Object[]) values, seperator);
else
return values.toString();
}

/**
* get element from elementes by random
*
* @param elements
* @return
*/
public static String randomElement(String[] elements) {
if (ArrayUtils.isEmpty(elements)) {
return StringUtils.EMPTY;
}

int index = new Random().nextInt(elements.length);
return CollectionUtils.get(elements, index).toString();
}

}

hexo搭建github博客

一、创建Github Pages

Github Pages为我们提供静态页面的托管。
参见:一步步在GitHub上创建博客主页(2)

1. 注册github账号

登录github.com,创建用户账号:yeshaoting。
访问地址:https://github.com/yeshaoting

2. 配置和使用github

参见:如何搭建一个独立博客——简明 Github Pages与 jekyll 教程

生成新的SSH Key

1
ssh-keygen -t rsa -C "yeshaoting@163.com"

在~/.ssh目录会生成秘钥id_rsa,公钥id_rsa.pub

添加SSH key到github

  1. 查看并复制公钥id_rsa.pub内容。
  2. 登录github,在Accout Settings -> SSH Public Keys -> add another public keys
  3. 将复制id_rsa.pub内容复制到密钥文本框中。

测试

1
ssh -T git@github.com

redis单机多实例部署

[TOC]

一、redis安装

Redis介绍

Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表、哈希、集合和有序集合5种。支持在服务器端计算集合的并、交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

1. 下载redis

1
2
3
4
cd /opt/work/local

wget -c http://download.redis.io/releases/redis-3.0.3.tar.gz
tar -zxvf redis-3.0.3.tar.gz

解压后的文件目录如下:
解压后的Redis目录结构

2. 编译redis

1
2
cd /opt/work/local/redis-3.0.3
make

3. 拷贝产生的可执行命令

1
2
3
mkdir -p /opt/work/local/redis/bin
cd /opt/work/local/redis-3.0.3/src
cp -p redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server mkreleasehdr.sh /opt/work/local/redis/bin

4. redis服务启动

(1) 修改环境变量(vim ~/.bash_profile)如下:

1
2
3
REDIS_HOME=/opt/work/local/redis

PATH=$PATH:$HOME/bin:$REDIS_HOME/bin

(2) 修改完成后,记得使用source ~/.bash_profile生效。

(3) 查看redis-server使用文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[@zw_25_105 local]# redis-server --help
Usage: ./redis-server [/path/to/redis.conf] [options]
./redis-server - (read config from stdin)
./redis-server -v or --version
./redis-server -h or --help
./redis-server --test-memory <megabytes>

Examples:
./redis-server (run the server with default conf)
./redis-server /etc/redis/6379.conf
./redis-server --port 7777
./redis-server --port 7777 --slaveof 127.0.0.1 8888
./redis-server /etc/myredis.conf --loglevel verbose

Sentinel mode:
./redis-server /etc/sentinel.conf --sentinel

(4) 启动单机redis
使用默认的参数启动redis:redis-server
指定端口启动redis:redis-server --port 6380

(5) 允许redis端口远程连接
修改防火墙配置文件,如下所示:

1
2
3
4
5
6
7
vim /etc/sysconfig/iptables

# 添加一行
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6380 -j ACCEPT

# 重新加载规则
service iptables restart

至此你就可以用客户端redis-cli连接了:redis-cli -h 127.0.0.1 -p 6380

|