常用的shell命令

一、SSH到服务器上再执行shell命令

1
2
3
4
5
ssh -t root@192.168.111.111 \
"sudo cp -rf ${REMOTE_DESTS[$key]#*:}/${NGINX_CONF_FILENAME} /etc/nginx/sites-available/ &&
sudo rm -rf ${REMOTE_DESTS[$key]#*:}/${NGINX_CONF_FILENAME} &&
sudo ln -sf /etc/nginx/sites-available/${NGINX_CONF_FILENAME} /etc/nginx/sites-enabled/${NGINX_CONF_FILENAME} &&
sudo service nginx reload"

二、查看或修改监控文件系统(Inotify)的watch数目

1
2
3
4
5
# 设置
sudo sysctl fs.inotify.max_user_watches=524288

# 查看
sysctl -a | grep inotify

三、查看Ubuntu操作系统位数及版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看Ubuntu操作系统位数
# 方法一: getconf
getconf LONG_BIT
# 64 or 32

# 方法二: uname -a
uname -a
# Linux user-3020 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
# i686表示32位, x86_64表示64位

# 查看Ubuntu操作系统版本
lsb_release -a
# Distributor ID: Ubuntu
# Description: Ubuntu 14.04.2 LTS
# Release: 14.04
# Codename: trusty

四、动态查看一个文件

1
tail -f filename

五、sudo操作手动输入密码

1
echo "abc123_" | sudo -S sh -c "cp /home/user/hosts /etc/hosts"

六、替换变量中字符

第一种方式

1
COMMIT_MSG=$(COMMIT_MSG//feat/build) # 将COMMIT_MSG中所有的feat替换成build

第二种方式: sed

1
COMMIT_MSG=$(echo $COMMIT_MSG | sed 's/^ //g') #去除COMMIT_MSG变量中所有左边的空格

第三种方式: tr命令

tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。

语法

1
tr(选项)(参数)

选项

  • -c或——complerment:取代所有不属于第一字符集的字符;
  • -d或——delete:删除所有属于第一字符集的字符;
  • -s或–squeeze-repeats:把连续重复的字符以单独一个字符表示;
  • -t或–truncate-set1:先删除第一字符集较第二字符集多出的字符。

参数

  • 字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;

*字符集2:指定要转换成的目标字符集。

实例

将输入字符由大写转换为小写:

1
2
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
hello world

‘A-Z’ 和 ‘a-z’都是集合,集合是可以自己制定的,例如:’ABD-}’、’bB.,’、’a-de-h’、’a-c0-9’都属于集合,集合里可以使用’\n’、’\t’,可以可以使用其他ASCII字符。

更详细的tr实例

七、if指令详解(TODO)

判断文件夹是否存在

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
# 如果文件夹不存在,创建文件夹
if [ ! -d "/myfolder" ]; then
mkdir /myfolder
fi

# shell判断文件,目录是否存在或者具有权限

folder="/var/www/"
file="/var/www/log"

# -x 参数判断 $folder 是否存在并且是否具有可执行权限
if [ ! -x "$folder"]; then
mkdir "$folder"
fi

# -d 参数判断 $folder 是否存在
if [ ! -d "$folder"]; then
mkdir "$folder"
fi

# -f 参数判断 $file 是否存在
if [ ! -f "$file" ]; then
touch "$file"
fi

# -n 判断一个变量是否有值
if [ ! -n "$var" ]; then
echo "$var is empty"
exit 0
fi

# 判断两个变量是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi

八、开始行和结束行的内容

1
2
3
4
5
6
7
8
9
10
11
# 文件最后100行
tail -n 100 file

# 文件开头100行
head -n 100 file

# 文件指定开始行和结束行的内容(包头不包尾)
sed '1,100p' file

# 文件有多少行
wc -l file

九、用来从文件或者变量中提取字段(awk)

awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。

1
2
echo "Adam Bor, 34, IndiaKerry Miller, 22, USA" | awk -F, '{print $1 "," $3 }'
# Adam Bor, IndiaKerry Miller, USA

这里我们使用,作为字段分割符,同时打印第一个和第三个字段

十、输出不换行(echo)

echo的参数中, -e表示开启转义, /c表示不换行,脚本如下:

1
2
3
4
5
#!/bin/sh
#filename: 1
echo -e "please input a value:\c"
read value
# echo "what you input is:" $valuel

脚本2:

1
2
3
4
5
#!/bin/sh
#filename: 1
echo -n "please input a value:"
read value
echo "what you input is:" $value

十一、字符串大小写不敏感的比较

通用的方法是将字符串先转换成小写后再比较

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

xxx="Temp"
yyy="temp"

x_tmp=$(echo $xxx | tr [A-Z] [a-z])
y_tmp=$(echo $yyy | tr [A-Z] [a-z])

if [ "$x_tmp " = "$y_tmp " ]; then
echo "PASS"
else
echo "FAIL"
fi

十二、**&&** 运算符

语法格式:

1
command1 && command2 [&& command3 ...]

&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。

1 命令之间使用 && 连接,实现逻辑与的功能。
2 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
3 只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。

十三、**||** 运算符

语法格式:

1
command1 || command2 [|| command3 ...]

||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。

1 命令之间使用 || 连接,实现逻辑或的功能。
2 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
3 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。

十四、判断变量中是否包含某个字符串

3 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。

1
2
3
str="this is a string"
[[ $str =~ "this" ]] && echo "$str contains this"
[[ $str =~ "that" ]] || echo "$str does NOT contain that"

结果为:
this is a string contains this
this is a string does NOT contains that
“[[“ 判断命令和 “=~”正则式匹配符号

十五、shell中 [ ][[ ]] 的区别

http://blog.csdn.net/ysdaniel/article/details/7905818

十六、shell中 ‘’ , “”`` 的区别

http://www.cnblogs.com/Skyar/p/5914942.html

参考地址:

基础语法
echo指令

MAC搭建个人博客hexo+github详细完整步骤

自己也算是摸爬滚打搭建成功,然后自己再重新安装部署一遍,把完整步骤分享给大家,同时最后有一些连接,如果我的步骤不行,大家可以参考其他人的.

一、安装Homebrew

Homebrew是基于Ruby的,所以安装过程也是很简单的,把下面的代码粘贴到Terminal中执行

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

查看安装是否成功:

1
brew --version

如下图所示表示安装成功

image

更多的brew命令

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
44
45
46
47
//查看brew的帮助
brew –help

//安装软件
brew install git

//卸载软件
brew uninstall git

//搜索软件
brew search git

//显示已经安装软件列表
brew list

//更新软件,把所有的Formula目录更新,并且会对本机已经安装并有更新的软件用*标明。
brew update

//更新某具体软件
brew upgrade git

//查看软件信息
brew [info | home] [FORMULA...]

//删除程序,和upgrade一样,单个软件删除和所有程序老版删除。
brew cleanup git
brew cleanup

//查看那些已安装的程序需要更新
brew outdated


//其它Homebrew指令:
brew list //—列出已安装的软件

brew update //—更新Homebrew

brew home * //—用浏览器打开

brew info * //—显示软件内容信息

brew deps * //—显示包依赖

brew server * //—启动web服务器,可以通过浏览器访问
//http://localhost:4567/ 来同网页来管理包

brew -h brew //—帮助

二、安装Git

1、使用brew安装Git

1
brew install git

2、完成安装

查看是否安装成功

1
git --version

Git安装成功

三、通过nvm安装指定版本的node

1、安装nvm

1
brew install nvm

2、配置nvm

配置nvm在shell中可以使用nvm命令,修改~/.bash_profile文件,如果不存在,新建 .bash_profile文件

1
2
cd ~
vim .bash_profile

在文件中添加如下命令:

1
2
export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh

重新source

1
source .bash_profile

3、安装node

1
2
3
4
5
6
7
nvm ls-remote 查看 所有的node可用版本

nvm install xxx 下载你想要的版本

nvm use xxx 使用指定版本的node

nvm alias default xxx 每次启动终端都使用该版本的node

4、完成安装

查看是否安装成功

1
2
node -v
npm -v

Node安装成功

Read More

Javascript语法糖

1.Array.prototype.slice

数组的slice()方法通常用来从一个数组中抽取片断。但很多开发者不了解的是,这个方法还可以用来将“类数组”元素(比如 arguments、参数列表、节点列表和属性列表)转换成真正的数组:(译注:DOM 元素的属性列表通过 attributes属性获取), Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组.

1
2
3
4
5
6
7
var a={length:2,0:'first',1:'second'};
Array.prototype.slice.call(a);// ["first", "second"]

var a={length:2};
Array.prototype.slice.call(a);// [undefined, undefined]

var argsArr = Array.prototype.slice.call(arguments);

2.使用push来合并数组

我们知道当我们想要合并两个数组时一般使用Array的concat()方法来试试,concat方法能够将两个及两个以上的数组合并成一个数组,同时我们也可以使用Array prototype 的push方法来实现两个数组的合并.

1
2
3
4
5
6
7
var a = ['hank', 'mark']

var b = ['hulk']

Array.prototype.push.apply(a, b)

console.log(a) // ['hank', 'mark', 'hulk']

3.Js数据去掉小数点后边的0

在一起,我一般是使用正则表达式来替换,先判断小数点后面有无0和0的位置,然后在使用正则来替换这些0。今天突然发现一个很神奇的方法: parseFloat()

1
2
var a = 1.0;
a = parseFloat(a) // 1

是不是特别简单?

4.JS浮点数运算精度

在Javascript中两个浮点数进行运算是得到的结果可能不是我们想要的结果,比如:

1
2
3
4
5
var a, b;
a = 0.2;
b = 0.1;

c = a + b // 0.30000000000000004, 不是我们想要的0.3

主要是因为计算机是二进制浮点运算,而我们输入的是十进制浮点数,十进制数转化为二进制运算过后再转化回来,在转化过程中可能会有损失.

解决办法,先装换成整数,运算过后,再装换回来:

1
2
3
4
5
6
7
8
9
10
11
12
const T_NUMBER = 'number';
// 两数相减,其他运算同理
customSubtract = function(minuend, subtrahend) {
var maxDecimalDigits, minuendDecimalDigits, minuendStr, result, subtrahendDecimalDigits, subtrahendStr;
minuendStr = typeof minuend === T_NUMBER ? minuend + '' : minuend;
subtrahendStr = typeof subtrahend === T_NUMBER ? subtrahend + '' : subtrahend;
minuendDecimalDigits = minuendStr.indexOf('.') === -1 ? 0 : minuendStr.length - minuendStr.indexOf('.') - 1;
subtrahendDecimalDigits = subtrahendStr.indexOf('.') === -1 ? 0 : subtrahendStr.length - subtrahendStr.indexOf('.') - 1;
maxDecimalDigits = Math.pow(10, Math.max(minuendDecimalDigits, subtrahendDecimalDigits));
result = (minuend * maxDecimalDigits - subtrahend * maxDecimalDigits) / maxDecimalDigits;
return result;
};

Read More

菜鸟学习Javascript模块化

一、模块化的定义

模块化是一种处理复杂系统分解为更好的可管理模块的方式。它可以通过在不同组件设定不同的功能,把一个问题分解成多个小的独立、互相作用的组件,来处理复杂、大型的软件。简单点来讲就是以功能为单位,然后通过不同功能的组合来实现一个系统,模块化的主要的目的就是为了减少依赖,减少耦合,提交代码的复用性,最终提交开发的效率。为了这个目的,所以我们必须将耦合密度的功能定义在一个模块中,并且在每个模块中第一一些入口和出口,以方便模块的组合和交互。

二、Javascript的模块化

随着网站逐渐变成”互联网应用程序”,嵌入网页的Javascript代码越来越庞大,越来越复杂。Javascript模块化编程,已经成为一个迫切的需求。理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块。

三、Javascript模块化的发展

1、原始写法

模块就是实现特定功能的一组方法。,不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块。

1
2
3
4
5
6
function m1(){
  //...
}
function m2(){
  //...
}

缺点:”污染”了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系。

2、对象写法

为了解决上面的缺点,可以把模块写成一个对象,所有的模块成员都放到这个对象里面。使用的时候,就是调用这个对象的属性。

1
2
3
4
5
6
7
8
9
var module1 = new Object({
  _count : 0,
  m1 : function (){
    //...
  },
  m2 : function (){
    //...
  }
});

缺点:写法会暴露所有模块成员,内部状态可以被外部改写

3、立即执行函数写法

使用”立即执行函数”,可以达到不暴露私有成员的目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
var module1 = (function(){
  var _count = 0;
  var m1 = function(){
    //...
  };
  var m2 = function(){
    //...
  };
  return {
    m1 : m1,
    m2 : m2
  };
})();

module1就是Javascript模块的基本写法。下面,再对这种写法进行加工。

4、放大模式

如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块,这时就有必要采用”放大模式”。

1
2
3
4
5
6
var module1 = (function (mod){
  mod.m3 = function () {
    //...
  };
  return mod;
})(module1);

上面的代码为module1模块添加了一个新方法m3(),然后返回新的module1模块。

5、宽放大模式

在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。如果采用上一节的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用”宽放大模式”。

1
2
3
4
var module1 = ( function (mod){
  //...
  return mod;
})(window.module1 || {});

与”放大模式”相比,"宽放大模式"就是”立即执行函数”的参数可以是空对象。

6、输入全局变量

独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。
为了在模块内部调用全局变量,必须显式地将其他变量输入模块。

1
2
3
var module1 = (function ($, YAHOO) {
  //...
})(jQuery, YAHOO);

上面的module1模块需要使用jQuery库和YUI库,就把这两个库(其实是两个模块)当作参数输入module1。这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显。

Read More

ubuntu查看和关闭端口

一、查看端口

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
netstat -anp

// result
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:82 0.0.0.0:* LISTEN -
tcp 0 0 192.168.222.198:50233 180.97.33.107:443 ESTABLISHED 2361/google-chrome-
...
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 1996 - /tmp/mongodb-27017.sock
unix 2 [ ACC ] STREAM LISTENING 781 - /tmp/.X11-unix/X0
unix 2 [ ACC ] STREAM LISTENING 12932 1799/xfce4-session /tmp/.ICE-unix/1799
unix 2 [ ACC ] STREAM LISTENING 12931 1799/xfce4-session @/tmp/.ICE-unix/1799
unix 2 [ ACC ] STREAM LISTENING 15489 1915/fcitx /tmp/fcitx-socket-:0
unix 2 [ ACC ] STREAM LISTENING 16412 2068/sogou-qimpanel /tmp/sogou-qimpaneluser
unix 2 [ ACC ] STREAM LISTENING 15796 2361/google-chrome- /tmp/.com.google.Chrome.KwiQ8d/SingletonSocket
...

// 查看某个端口的进程
netstat -anp | grep 8081

// result
tcp 0 0 127.0.0.1:56770 127.0.0.1:8081 ESTABLISHED 2361/google-chrome-
tcp6 0 0 :::8081 :::* LISTEN 5359/gulp
tcp6 0 0 127.0.0.1:8081 127.0.0.1:56770 ESTABLISHED 5359/gulp

二、关闭某个端口的进程

1
kill -9 5359