erlang 18.0重新实现了time相关功能,性能更好,可伸缩性更好,精度更好
more >>
影响Erlang Shell,告诉终端程序是否要处理unicode
\$ echo $LC_CTYPE
\$ echo $LANG
zh_CN.UTF-8
如,下例中encoding是unicode:
Erlang R15B (erts-5.9) [source] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9 (abort with ^G)
1> io:getopts().
[{expand_fun,#Fun},
{echo,true},
{binary,false},
{encoding,unicode}]
改成latin1看看,显示都成乱码了:
LC_CTYPE=en_US.ISO-8859-1 /usr/local/bin/erl
Erlang R15B (erts-5.9) [source] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]Eshell V5.9 (abort with ^G)
1> io:getopts().
[{expand_fun,#Fun},
{echo,true},
{binary,false},
{encoding,latin1}]
2> "\346\210\221\344\273\254".
[230,136,145,228,187,172]
3> io:format("~ts",[lists:seq(20204,20220)]).
\x{4EEC}\x{4EED}\x{4EEE}\x{4EEF}\x{4EF0}\x{4EF1}\x{4EF2}\x{4EF3}\x{4EF4}\x{4EF5}\x{4EF6}\x{4EF7}\x{4EF8}\x{4EF9}\x{4EFA}\x{4EFB}\x{4EFC}ok
4> io:setopts([{encoding,unicode}]).
ok
5> "我们".
[25105,20204]
输入"我们"变成了"\346\210\221\344\273\254"
选择Shell可打印字符的范围,可以是erl +pc latin1 或者 erl +pc unicode, 默认情况下,erl启动参数是latin1
io:printable_range/0返回可打印的字符集
io_lib:printable_list/1判断一个List是否可打印
$ erl
Erlang/OTP 17 [erts-6.2] [source] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]Eshell V6.2 (abort with ^G)
1> io:printable_range().
latin1
2> io_lib:printable_list([25105]).
false
3> unicode:characters_to_binary("我").
<<230,136,145>>
4> file:write_file("test", [unicode:characters_to_binary("我")]).
ok
5> file:read_file("test").
{ok,<<230,136,145>>}
6> file:write_file("test", [io_lib:format("~w.~n", [unicode:characters_to_binary("我")])]).
ok
7> file:consult("test").
{ok,[<<230,136,145>>]}230,136,145>230,136,145>230,136,145>17.0 +pc unicode情况下,unicode字符串可以正常显示如下
$ erl +pc unicode
Erlang/OTP 17 [erts-6.2] [source] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]Eshell V6.2 (abort with ^G)
1> io:printable_range().
unicode
2> io_lib:printable_list([25105]).
true
3> <<230,136,145,228,187,172,229,173,166,228,185,160,69,114,108,97,110,103>>.
<<"我们学习Erlang"/utf8>>
4> unicode:characters_to_binary("我").
<<"我"/utf8>>
5> file:write_file("test", [unicode:characters_to_binary("我")]).
ok
6> file:read_file("test").
{ok,<<"我"/utf8>>}
7> file:write_file("test", [io_lib:format("~w.~n", [unicode:characters_to_binary("我")])]).
ok
8> file:consult("test").
{ok,[<<"我"/utf8>>]}230,136,145,228,187,172,229,173,166,228,185,160,69,114,108,97,110,103>
返回的是当前OTP版本使用的默认编码方式.R16B是latin1, 17.0是utf8.
$ erl
Erlang/OTP 17 [erts-6.2] [source] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]Eshell V6.2 (abort with ^G)
1> epp:default_encoding().
utf8
文件注释头可以指定编译器使用某种编码来解析,如1
2%% -*- coding: utf-8 -*-
%% -*- coding: latin-1 -*-
例如:1
2
3
4
5%% -*- coding: utf-8 -*-
-module(test).
-export([test/0]).
test() ->
["我", <<"我"/utf8>>].
$ erl
Erlang/OTP 17 [erts-6.2] [source] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]Eshell V6.2 (abort with ^G)
1> test:test().
[[25105],<<230,136,145>>]230,136,145>
R15B, erlang一律以latin-1编译代码,遇到中文都编译成这种,
如test模块的函数:1
2data() -> "中国人".
data2() -> <<"中国人">>.
运行时:
1> test:data().
[228,184,173,229,155,189,228,186,186]
2> test:data2().
<<228,184,173,229,155,189,228,186,186>>228,184,173,229,155,189,228,186,186>
而erlang 17中,erlang一律默认以unicode编译代码(也可以在文件头指定),遇到中文都编译成这种,
如test模块的函数:1
2data() -> "中国人".
data2() -> <<"中国人"/utf8>>. (注意这里需要加utf8类型)
运行时:
1> test:data().
[20013,22269,20154]
2> test:data2().
<<228,184,173,229,155,189,228,186,186>>228,184,173,229,155,189,228,186,186>
而这里如果data2()没加utf8类型说明,即写成了这样1
data2() -> <<"中国人">>.
则会有问题:
1> test:data2().
<<"-ýº">>
2> io:format("~w", [test:data2()]).
<<45,253,186>>ok45,253,186>
或者写成了这样1
2%% -*- coding: latin-1 -*-
data2() -> <<"中国人"/utf8>>.
即utf8类型说明与latin-1文件编码说明冲突,则也会有问题:
1> test:data2().
<<195,164,194,184,194,173,195,165,194,155,194,189,195,164, 194,186,194,186="">>
2> io:format("~ts", [v(2)]).
ä¸å½äººok
3> io:format("~s", [v(2)]).
ä¸Âå½人ok195,164,194,184,194,173,195,165,194,155,194,189,195,164,>
所以以下这段问题代码1
2
3
4-module(t).
-export([test/0]).
test() ->
["我", <<"我">>].
R17编译后的运行结果为:
1> t:test().
[[25105],<<17>>]17>
字符串是字符串,binary是binary,
字符串是这样的[25105, 25105, 97]
binary是这样的, <<230,136,145,230,136,145,97>>, 二进制这里面一个数字肯定是1个字节的, 要不不叫binary了230,136,145,230,136,145,97>
<<"我">>相当于<<25105>>,而二进制一个数字需要是1个字节,所以截断变成<<17>>
而加上utf8描述符后就不会被截断17>25105>
<<"我"/utf8>>.
<<230,136,145>>230,136,145>
所以这里把代码改为1
2
3
4-module(t).
-export([test/0]).
test() ->
["我", <<"我"/utf8>>].
即可
erl启动的时候添加不同的flag可以控制解析文件名的方式:
可以使用file:native_name_encoding检查此参数.
$ erl
Erlang/OTP 17 [erts-6.2] [source] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]Eshell V6.2 (abort with ^G)
1> file:native_name_encoding().
utf8
2> file:read_file("test我.erl").
{ok,<<45,109,111,100,117,108,101,40,39,116,101,115,116,230,136,145,39,41,46,32,10,45,101,120,112,111,114,...>>}45,109,111,100,117,108,101,40,39,116,101,115,116,230,136,145,39,41,46,32,10,45,101,120,112,111,114,...>
+fnl后
$ erl +fnl
Erlang/OTP 17 [erts-6.2] [source] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]Eshell V6.2 (abort with ^G)
1> file:native_name_encoding().
latin1
2> file:read_file("test我.erl").
{error,badarg}
Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频
PDF在这里
官方文档
sudo apt-get install nautilus-open-terminal
重启nautilus才能生效
nautilus -q
首先, 以管理员身份登录win7系统,依次打开“控制面板->网络和共享中心->更改高级共享设置”。
选中以下四项:“启用网络发现”、“启用文件和打印机共享”、“启用公用文件夹共享”和“关闭密码保护共享”。建议也启用流媒体共享,在家庭或工作栏目下选中“允许windows管理家庭组连接”。
然后,右键点击需要共享的文件夹,选择“属性->共享->高级共享”,选中“共享此文件夹”,点击应用,确定后关闭。(注:上一级文件夹如果已共享,其下面的子文件夹也同时被共享。)
接下来,需要将文件夹的安全权限改为“允许任何人访问”。右键点击共享文件夹,依次选择“属性->安全->编辑->添加”,输入“everyone”,点确定。
在权限框中选中要赋予的权限,如:“完全控制”、“更改”和“读取”。
然后,右键点击需要共享的文件夹,选择“属性->共享->共享...->给需要权限的人权限(比如Everyone读取/写入)
由于系统自带的防火墙的默认设置为“允许文件和打印机共享的”,
如有第三方防火墙,还要确保其启用了文件和打印机共享,否则,会出现共享的文件夹别人无法访问的问题。
按Ctrl-L(即转到),
输入例如:smb://[email protected]/myshare/ 即可
http://www.help315.com.cn/a/j/xt/2011/1116/161.html
http://3y.uu456.com/bp-079224ef102de2bd960588af-1.html
Bash 中的数组仅限制为单一维度
数组变量就像其它 bash 变量一样命名,当被访问的时候,它们会被自动地创建。这里是一个例子:1
2
3[me@linuxbox ~]$ a[1]=foo
[me@linuxbox ~]$ echo ${a[1]}
foo
也可以用 declare 命令创建一个数组:1
[me@linuxbox ~]$ declare -a a
数组赋值
有两种方式可以给数组赋值。单个值赋值使用以下语法:1
name[subscript]=value
这里的 name 是数组的名字,subscript 是一个大于或等于零的整数(或算术表达式)。
注意数组第一个元素的下标是0, 而不是1。数组元素的值可以是一个字符串或整数。
多个值赋值使用下面的语法:1
name=(value1 value2 ...)
还可以通过指定下标,把值赋给数组中的特定元素:1
[me@linuxbox ~]$ days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)
找到数组使用的下标
因为 bash 允许赋值的数组下标包含 “间隔”,有时候确定哪个元素真正存在是很有用的。
若 parameter 没有设置(例如,不存在)或者为空,展开结果是 word 的值。
若 parameter 不为空,则展开结果是 parameter 的值。1
$ echo ${foo:-"substitute value if unset"}
substitute value if unset
若 parameter 没有设置或为空,展开结果是 word 的值。另外,word 的值会赋值给 parameter。
若 parameter 不为空,展开结果是 parameter 的值。
注意: 位置参数或其它的特殊参数不能以这种方式赋值。
若 parameter 没有设置或为空,这种展开导致脚本带有错误退出,并且 word 的内容会发送到标准错误。
若 parameter 不为空, 展开结果是 parameter 的值。1
$ echo ${foo:?"parameter is empty"}
bash: foo: parameter is empty
若 parameter 没有设置或为空,展开结果为空。
若 parameter 不为空, 展开结果是 word 的值会替换掉 parameter 的值;然而,parameter 的值不会改变。
返回变量名的参数展开
shell 具有返回变量名的能力。这会用在一些相当独特的情况下。
这种展开会返回以 prefix 开头的已有变量名。根据 bash 文档,这两种展开形式的执行结果相同。
这里,我们列出了所有以 BASH 开头的环境变量名:1
2
3
4[me@linuxbox ~]$ echo ${!BASH*}
BASH BASH_ARGC BASH_ARGV BASH_COMMAND BASH_COMPLETION
BASH_COMPLETION_DIR BASH_LINENO BASH_SOURCE BASH_SUBSHELL
BASH_VERSINFO BASH_VERSION
展开成由 parameter 所包含的字符串的长度。
这些展开用来从 parameter 所包含的字符串中提取一部分字符。
若 offset 的值为负数,则认为 offset 值是从字符串的末尾开始算起,而不是从开头。
注意负数前面必须有一个空格, 为防止与 \${parameter:-word} 展开形式混淆。length,若出现,则必须不能小于零。
这些展开会从 paramter 所包含的字符串中清除开头一部分文本,这些字符要匹配定义的 patten。p
attern 是 通配符模式,就如那些用在路径名展开中的模式。这两种形式的差异之处是该 # 形式清除最短的匹配结果, 而该 ## 模式清除最长的匹配结果。
1 | [me@linuxbox ~]$ foo=file.txt.zip |
这些展开和上面的 # 和 ## 展开一样,除了它们清除的文本从 parameter 所包含字符串的末尾开始,而不是开头。1
2
3
4
5[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ echo ${foo%.*}
file.txt
[me@linuxbox ~]$ echo ${foo%%.*}
file
使用 time 命令来比较这两个脚本版本的效率
time可以测试脚本的执行时间
使用 declare 命令,我们能强制一个 变量总是包含所需的格式,无论如何赋值给它。
declare -u upper
declare -l lower
1 | [me@linuxbox ~]$ posit-param a b c d |
注意: 实际上通过参数展开方式你可以访问的参数个数多于9个。
只要指定一个大于9的数字,用花括号把该数字括起来就可以。 例如 ${10}, ${55}, ${211}
另外 shell 还提供了一个名为 $#
,可以得到命令行参数个数的变量:
执行一次 shift 命令, 就会导致所有的位置参数 “向下移动一个位置”。
每次 shift 命令执行的时候,变量 $2
的值会移动到变量 $1
中,变量 $3
的值会移动到变量 $2
中,依次类推。 变量 $#
的值也会相应的减1。
basename 命令清除 一个路径名的开头部分,只留下一个文件的基本名称。
正如位置参数被用来给 shell 脚本传递参数一样,它们也能够被用来给 shell 函数传递参数。
位置参数 $0
总是包含命令行中第一项的完整路径名
$* $@
Bash 的多选复合命令称为 case。它的语法规则如下所示:1
2
3case word in
[pattern [| pattern]...) commands ;;]...
esac
现在的 bash 版本,添加 “;;&” 表达式来终允许 case 语句继续执行下一条测试,而不是简单地终止运行。1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/bin/bash
# case4-2: test a character
read -n 1 -p "Type a character > "
echo
case $REPLY in
[[:upper:]]) echo "'$REPLY' is upper case." ;;&
[[:lower:]]) echo "'$REPLY' is lower case." ;;&
[[:alpha:]]) echo "'$REPLY' is alphabetic." ;;&
[[:digit:]]) echo "'$REPLY' is a digit." ;;&
[[:graph:]]) echo "'$REPLY' is a visible character." ;;&
[[:punct:]]) echo "'$REPLY' is a punctuation symbol." ;;&
[[:space:]]) echo "'$REPLY' is a whitespace character." ;;&
[[:xdigit:]]) echo "'$REPLY' is a hexadecimal digit." ;;&
esac
当我们运行这个脚本的时候,我们得到这些:1
2
3
4
5
6[me@linuxbox ~]$ case4-2
Type a character > a
'a' is lower case.
'a' is alphabetic.
'a' is a visible character.
'a' is a hexadecimal digit.
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true