下面是一些未归类的命令及操作方法,专门记在此文中,以便将来查询。由于文章较长,请用Ctrl+F查询关键字来定位到你需要的内容。
(1)用shell对某个数据文件的第二列求和
cat a.txt | awk '{print $2}' | awk 'BEGIN{sum=0}{sum+=$1}END{print sum}'
其中,a.txt即为数据文件。
(2)echo输出制表符(tab,\t)
要用echo语句输出制表符\t到文件中,需要加 -e 参数:
A="mine";
B="yours";
echo -e "$A\t$B" > 1.txt
如果不加 -e 参数,则输出文件中会有一个 \t 字符串,而不是一个制表符。
(3)在Xshell中鼠标选中文字时自动换行的问题
如果你用Xshell,并且遇到了“用鼠标选中一段文字时自动换行”的问题,那么你有可能是使用了网易的“有道词典”导致的。当你不小心按了某组合快捷键的时候,就有可能触发有道词典的某个功能,从而导致你在Xshell中选中文字时自动换行。这个现象非常令人讨厌,使用别的词典软件都没有这个问题。
退出有道词典就可以解决这个问题了。
我想知道的是:网易的有道词典开发人员中没有使用Xshell的?
(4)一个在shell中向一批手机号发送报警短信的例子
假设你要在shell中向一批手机号发送报警短信,可以如下例操作:
PHONES=(136XXXXXXXX 137XXXXXXXX 138XXXXXXXX)
for PHONE_NUMBER in ${PHONES[*]}
do
#TODO:send SMS message to $PHONE_NUMBER
sleep 2
done
文章来源:http://www.codelast.com/
其中,“TODO”的那部分是调用你的短信发送接口(通常是一个URL),这里无法举例。
(5)去掉WordPress的Auto SyntaxHighlighter插件右上角的问号
使用Auto SyntaxHighlighter插件的人都知道,3.0.83版本的这个插件会在高亮语法块的右上角生成一个小问号,颜色特别难看,要去掉它的话,需要修改其源码。按网上的说法,修改 wp-content/plugins/auto-syntaxhighlighter/SyntaxHighlighter/src/styles/shCore.css 文件,找到:
.syntaxhighlighter .toolbar {position: absolute !important;right: 1px !important;top: 1px !important;width: 11px !important;height: 11px !important;font-size: 10px !important;z-index: 10 !important;}
加一行 display: none; 变成:
.syntaxhighlighter .toolbar {position: absolute !important;right: 1px !important;top: 1px !important;width: 11px !important;height: 11px !important;font-size: 10px !important;z-index: 10 !important;display: none;}
就行了,但是在我这里试验的结果是:无效。究其原因,是由 wp-content/plugins/auto-syntaxhighlighter/auto-syntaxhighlighter.php 文件定义的:
wp_register_style('ash_core', ASH_PLUGIN_URL.'SyntaxHighlighter/build/styles/shCore-min.css', array(), $this->_shlver);
所以,有效的方法是,修改文件 wp-content/plugins/auto-syntaxhighlighter/SyntaxHighlighter/build/styles/shCore-min.css,按上面的方法做同样的修改,就搞定了。这个文件是“紧凑版”的shCore.css,里面的代码非常不适合阅读,但是其小体积显然节约了网络流量。
(6)shell中循环读取文本文件的每一行
假设有如下数据文件:
[root@localhost ~]$ cat 1.txt
123
abc
def
如果要读取此文件的每一行,并进行一些处理,怎么做?这里把情况设想得简单一点,我们就统计一下行数(当然 wc -l 可以直接统计行数,不用这么麻烦,此处只是为了说明问题才这样做)。
方法A:
[root@localhost ~]$ cat wrong.sh
#!/bin/bash
COUNT=0
cat '1.txt' | while read LINE
do
COUNT=$((COUNT+1))
done
echo $COUNT
输出结果:0
文章来源:http://www.codelast.com/
方法B:
[root@localhost ~]$ cat right.sh
#!/bin/bash
COUNT=0
while read LINE
do
COUNT=$((COUNT+1))
done < 1.txt
echo $COUNT
输出结果:3
显然,方法B是正确的,方法A是错误的。但是为什么呢?方法A看上去同样无比正确,但是却得到了错误的结果。这是因为方法A采用管道的方式,使得脚本在做do ... done循环的时候,实际上是另启了一个进程,从而在里面的计数不会反映到外面去,所以无法计到数。
这个例子说明了,shell中的各种写法可能有不同的陷阱,如果你不知道,那么就会浪费很多时间去调试。
(7)shell中换行符(\n)的字符串拼接
如果要在shell中将换行符 \n 拼接到一个字符串中,可以这样做:
B="str"
A=$B$'\n'
这样变量A中得到的就是一个含有换行符的字符串。
(8)VS 2005中出现“fatal error RC1107: invalid usage; use RC /? for Help”错误的解决办法
如果你打开一个VC++ 2005项目的资源视图时,出现了这个错误的话,那么,一个很可能有用的解决办法就是:在“工具”→“选项”→“项目和解决方案”→“VC++目录”中,把“包含文件”、“引用文件”、“库文件”等所有路径中,最后的“\”都去掉,然后再重新打开工程,应该就没有问题了。
这应该是一个VS 2005的bug。
文章来源:http://www.codelast.com/
(9)如何配置log4j,使得可以将 INFO、ERROR 的日志输出到一个文件,其中 ERROR 的日志还同时会输出到另一个文件
请看此链接的第(48)条。
(10)在Unicode字符集下,将CString转成const char*的方法
CString strCS = _T("This is a test string.");
char szStr[256] = {0};
wcstombs(szStr, strCS, strCS.GetLength());
const char *p = szStr;
网上找到的方法,有用。
(11)正则匹配TAB(制表符)
假设要在Linux命令行下使用grep正则匹配TAB键(制表符),那么直接输入一个TAB就可以了:
grep -o "abc 123" file.txt
其中,“abc”和“123”之间是一个TAB,但是要注意,你在Linux命令行下是无法通过按键盘上的Tab键来输入一个TAB的,因为TAB已经被定义为补全命令的快捷键了。这时候,你需要先按Ctrl+V,再按Ctrl+I,就可以输入一个TAB了。
(12)在shell中判断:当不是以某用户身份执行脚本时,退出
#!/bin/bash
ROLE=`whoami`
if [[ "$ROLE"x = "root"x ]]; then
echo "You are running as root."
else
echo "You are running as $ROLE, please switch to root first!"
exit
fi
echo "Now you can run below program."
上面的脚本做的事:当不是以root身份运行此脚本时,提示用户并退出。其实相当简单,没什么好说的,关键就在字符串相等的判断上。
(13)在Emacs中显示UTF-8编码的文件内容/显示中文
对UTF-8编码、含中文的文本文件,要用Emacs打开它时能正常显示,需要做以下设置:
①在你的Linux用户所对应的Emacs配置文件 .emacs 中,添加以下内容:
(prefer-coding-system 'utf-8)(set-default-coding-systems 'utf-8)(set-terminal-coding-system 'utf-8)(set-keyboard-coding-system 'utf-8)(setq default-buffer-file-coding-system 'utf-8)(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))
这一段我是从网上抄来的,之后拿一个UTF-8(无BOM)编码、含中文的文件测试,发现在一台Linux server上有效,在另一台Linux server上则无效(仍然乱码)。最后找到原因是:跟Linux系统的locale设置有关,于是就要继续设置如下。
②在.bash_profile中添加:
LANG=zh_CN.UTF-8
然后重新登录终端,就可以用Emacs打开、显示含中文的文件了。当然,前提是:你的终端软件(例如Xshell)也必须要把encoding设置成Unicode(UTF-8)的。
文章来源:http://www.codelast.com/
以上整个过程都必须配合设置好,而很多人可能没发现缺少了一个环节,就导致了显示乱码,确实会比较烦人。
(14)在Xshell终端里启用Emacs的Meta key
Xshell设置选项如下:
不设置的话,就没有办法在Emacs中使用 Alt+x 来触发一些功能,例如在Emacs中使用gdb调试的时候运行gdb的快捷键 M-x gdb。
(15)gdb调试C++程序,设置断点时提示“No source file named XXX”错误的原因
原因可能有多种,我遇到的一种是:编译C++程序时没有添加-g参数导致编译出来的程序中不含调试信息,从而在gdb命令行下无论怎么设置断点(绝对路径或相对路径),它都提示“No source file named XXX”错误,让我以为是路径的原因。所以大家千万要注意了,不要找了半天是这个低级错误啊!
另外,你也可以参考一下这个链接。
(16)grep高亮导致的字符串长度计算错误问题
在Linux命令行下,你可以配置grep的结果高亮显示(参看这个链接的第26条),效果如下:
这个非常有帮助的功能,却有可能给你的shell脚本造成致命的隐患——有时会导致你在计算字符串长度时出错。
例如,有一个数据文件 a.txt 只有一行内容:
[root@localhost ~]# cat a.txt
1234567890
另外一个脚本 a.sh 想要统计 a.txt 的第一行的字符数有多少:
#!/bin/bash
A=`cat a.txt`
LEN=`expr ${#A}`
echo $LEN
结果如你所想的一样,输出为:10
但是,假设我们要求第一行必须是含“12”的,则应该添加上 grep 来过滤一下:
#!/bin/bash
A=`cat a.txt | grep 12`
LEN=`expr ${#A}`
echo $LEN
再执行,这时候你会发现,结果很“神奇”地变成了:25
怎么会有25个字符呢?这明明是“睁眼说瞎话”啊!
文章来源:http://www.codelast.com/
这就是按前面所说的方法添加了 grep 高亮显示的之后的结果。不信,你可以去掉.bash_profile中的grep高亮显示代码,再重新登录终端再执行脚本,一定就不会有这样的问题了。
(17)删除文件之后,df -h显示的磁盘空间占用没有刷新的问题
有时候你会发现,刚删除了一个很大的文件,而用 df -h 查看的磁盘空间占用还是那么多,没有释放,这可能是由于被删除的文件仍然被其他进程占用导致的。例如,用 nohup 程序名 & 启动了一个程序,会生成一个 nohup.out 文件,程序的输出都会写入这个文件中,这个文件越写越大,当大到一定程度时,你删除了这个文件,然后马上用 df -h 查看,磁盘空间并没有释放。这是因为你的程序还在占用 nohup.out 文件,如果你把你的进程kill掉,会发现df -h的结果马上就刷新了。
(18)如何在不切换用户的情况以,以指定的用户运行某一命令
su abc -c 'touch 1.txt'
表示以用户“abc”的身份运行后面引号中的命令。
(19)在vim中如何显示特殊字符
用vim打开一个文件,要显示其中的特殊字符(例如TAB)/取消显示,分别可以用如下两条命令:
:set list:set nolist
在显示特殊字符的情况下,TAB键将被标识为“^I”(不包含引号)。
(20)在shell中判断当前登录的Linux用户
USER=`whoami`
if [[ "$USER"x != "root"x ]]; then
echo "Must run as root."
exit 1
fi
以上代码的作用是:当执行此脚本的用户不是root时,退出。如果要判断“是root”,则把 != 改为 = 即可。
(21)已知某项目SVN地址,如何查看其所有提交日志
使用如下命令:
svn log http://android-wifi-tether.googlecode.com/svn/trunk
其中,后面的URL是项目的SVN地址。只要你有权限,那么就可以输出所有人提交代码时写的日志。
(22)PHP输出某一文件的内容
连这样弱爆了的内容都给记下来了:
<?php
$xml_contents = file_get_contents('./1.xml');
echo $xml_contents;
?>
这样,在访问这个PHP页面的时候,就会看到页面输出与该PHP文件处于同一目录下的 1.xml 文件的内容了。
(23)svn diff 命令的输出重定向到文件时,里面包含中文的问题
①对Windows:如果你在Windows下安装了SlikSVN作为你的subversion命令行工具,那么你可能会使用svn diff命令来输出代码修改的差异。但是,如果你的Windows是中文版的话,你会发现输出的diff文件是内含中文的(例如“工作副本”之类的词语),在配合Review Board系统使用的时候,如果你提交了这个内含中文的diff文件,Review Board系统会出问题——提示你文件损坏之类的,所以,要避免这个问题,就要保证diff文件不含中文,方法就是:到SlikSVN安装目录下的 Share\Locale 目录下,将里面的文件全部删除,这样,SlikSVN就只能输出英文语言的内容了。
②对Ubuntu,也可能遇到svn diff命令输出中文的问题。这时你需要修改一个环境变量:
export LANGUAGE=en_US.UTF-8
通常我是把这句话写在登录用户的.bashrc文件里,让它自动执行。
(24)Xshell的Sessions/会话/连接配置文件保存在哪里
如果是在Win7下,它可能在这个位置:
C:\Users\用户名\AppData\Roaming\NetSarang\Xshell\Sessions
要确定具体的位置,可以打开Xshell,菜单“File”→“Open”,在打开的对话框中点击“Open Session Folder”按钮,就会打开一个文件夹,这个文件夹就是保存了所有连接信息的文件夹,拷贝到别的计算机上就可以不用重新输入那些繁琐的服务器信息啦。
(24)awk的rshift函数
详见此处。
rshift(val, count)Return the value of val, shifted right by count bits.
(25)Win7的“未能连接一个Windows服务”错误的解决办法
在系统托盘处弹出一个图标,提示“未能连接一个Windows服务”,错误的具体内容为:
Windows无法连接到Syetem Event Notification Service服务。此问题阻止标准用户登录系统。作为管理员用户,您可以复查系统事件日志,以获得有关此服务未响应原因的详细信息。
我Google了一下,查到一个解决办法,经试验有效(但不保证对所有此问题的系统都有效)——
在命令行下执行命令:
NETSH WINSOCK RESET CATALOG
无论系统提示或不提示错误,重启系统看看是不是好了。如果仍然不行,那么请移步Google查找其他解决方案。
(26)运行shell脚本时提示“/bin/sh^M: bad interpreter: XXX”问题的解决办法
原因是换行符不对,用Emacs修改很简单:
Ctrl+x → ENTER → f → ENTER → 保存退出
(27)在CentOS 5.8上安装git
在CentOS 5.8上,如果你想yum install git,会提示找不到软件包,为了能yum install git,你需要先安装一个rpm包:
rpm -ivh http://mirror.chpc.utah.edu/pub/epel/5/i386/epel-release-5-4.noarch.rpm
如果是64位的系统,那么就用:
rpm -ivh http://mirror.chpc.utah.edu/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
然后就可以用yum install来安装啦。
有人会问,EPEL是什么?请看这个链接。
企业版 Linux 附加软件包(以下简称 EPEL)是一个由特别兴趣小组创建、维护并管理的,针对 红帽企业版 Linux(RHEL)及其衍生发行版(比如 CentOS、 Scientific Linux)的一个高质量附加软件包项目。
(28)Android连接上VPN之后还是无法打开被block的webpage的问题
原因可能有千万种,解决办法也可能不相同,这里有一法,你可以试验一下,如果无效,请移步Goolge另寻其他方法。
使用Root Explorer软件将 /etc/ppp/ip-up-vpn 文件的权限改为777即可。注意在修改之前要点击“Mount R/W”,否则不能修改权限。
(29)Nginx的error log中记录“FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream”错误的解决办法
按照这篇文章的说法,应该把fastcgi.conf配置文件中的“fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name”改为“fastcgi_param SCRIPT_FILENAME $request_filename”。
(30)Win7更新了最新的Nvidia显卡驱动后,系统颜色变得过于鲜艳的问题
要调整回一个“正常”的颜色,需要打开“Nvidia控制面板”(即nvcplui.exe程序,可能不同显卡对应的程序名不同),在“显示”→“调整桌面颜色设置”→“3. 应用以下增强功能”中,将“数字振动控制”的值设低一些,例如,我感到颜色过于鲜艳时,该值为70%多,而我调到了30%,才感到回到了正常状态。
(31)tar打包目录时,排除掉一些指定的文件
如下命令:
tar zcf a.tar.gz 2012* --exclude=*_*_*
将会把名字符合 2012* 的目录打包成a.tar.gz,其中,只要任何目录下含有 pattern 为 *_*_* 的文件,都会被排除掉,不会被打进tar包中,例如,一个名为“1_2_3”的文件,就会被排除掉。
(32)Visual Studio 2008中设置制表符(Tab)的缩进
这里仅针对VC项目来说。在“工具”→“选项”→“C/C++”→“制表符”中可以设置。如果想用空格代替制表符,选择“插入空格”即可。
(33)命令行创建两个版本的SVN diff文件
命令:
svn diff -r 3001:3000 > 1.diff
表示创建版本3001和3000之间的diff,并保存为1.diff文件。
(34)在Linux下查看一个进程占用的端口
先用如下命令找到进程的PID:
ps -ef | grep process-name
其中,process-name是你的进程名。找到PID(这里假设是26382)后,再用如下命令查看其占用的端口:
netstat -anlp | grep 26382
(35)修改Linux默认的SSH 22端口
SSH的默认22端口容易受到攻击,为了安全,可以改为其他端口,以下是修改方法:
①修改文件 /etc/ssh/sshd_config,找到注释掉的这一行:
#Port 22
改为:
Port 22 Port 34567
这表示同时使用22和34567作为SSH端口。
有人会说:为什么要设置两个端口?直接使用端口34567不就行了吗?因为如果你最后设置失败,22端口可能不再起作用,你就无法通过SSH连接服务器了,后果就是你只能通过远程控制卡或直接到服务器前连接显示器来重新配置正确,那样的话就悲剧了。所以,为了留个保险,先保留原来的22端口。
②重启两个服务:
/etc/init.d/sshd restart /etc/init.d/iptables restart
③通过新端口34567来SSH连接服务器,成功的话,就把前面保留的默认22端口给删掉,再重启上述两个服务,就OK了。
文章来源:http://www.codelast.com/
(36)在GNOME终端中的Emacs里打开Emacs的菜单
默认情况下,按F10是可以打开Emacs的菜单的,不过GNOME的终端可能会截获F10这个快捷键,你按F10的时候会变成打开GNOME终端的菜单,这非常让人讨厌。你可以在Emacs中执行以下命令:
M-X menu-bar-open
这样就可以打开Emacs的菜单了。
(37)Linux下用命令删除一个以文件名以减号(-)开头的文件
先cd到文件所在的目录,然后:
rm -f ./-filename
(38)Linux下用命令行查看进程监听的端口
netstat -anp | grep 程序名
(39)CentOS的网络安装地址
这里以CentOS 6.4为例。先下载net install的ISO(例如CentOS-6.4-i386-netinstall.iso),刻录到光盘上,用该光盘引导安装,在选择操作系统所在的介质(例如光驱,硬盘,NFS,URL)的时候,选择URL,然后输入用下面的方法找到的URL,即可开始安装:
到这里去找一个mirror,例如在中国大陆可以选择网易的服务器,对安装32位版本的CentOS 6.4,就是:http://mirrors.163.com/centos/6.4/os/i386/
如果想看更具体的安装过程截图,可参考此文。
(40)在Emacs中将文件转换为UTF-8编码
如何将一个在Emacs中打开的文本文件转换为UTF-8编码?下面的Emacs命令可以做到:
C-x C-m f utf-8-unix
然后回车即可。当然最后别忘了保存文件!
(41)用密钥文件登录的两台Linux如何scp文件
假设要从server A向server B上传文件(scp),那么只需要把私钥文件放到server A,你的用户根目录下的.ssh目录下,即 ~/.ssh/,然后把文件的权限改为600,再把它的用户改为你的用户,就可以scp文件到server B了(假设私钥文件名为identity):
chmod 600 identity chown your_user:your_user identity
这样做虽然可以达到目的,不过显然不安全,因为只要有权限在server A上访问此私钥文件的人,都可以用此私钥文件在其他地方用你的身份登录server A和server B了。
安全的做法是:在ssh客户端软件中设置允许forward agent,从而可以在你自己的计算机上ssh到server A,再scp文件,而不用直接修改server A。假设你使用Ubuntu的ssh客户端,那么修改 /etc/ssh/ssh_config 文件,将这一行:
# ForwardAgent no
改为:
ForwardAgent yes
即可。
(42)Linux shell命令生成一个随机数
echo -n $RANDOM | md5sum | awk '{print $1}'
文章来源:http://www.codelast.com/
(43)用shell命令删除文件中的指定行
如果你要删除一个文本文件中,含有你指定的字符串的那些行,可以用sed像下面这样操作:
sed -i '/abc/d' 1.txt
这样就会把1.txt中,含有“abc”字符串的行都删掉。
(44)Linux shell获取文件大小
还在用 ls -l your-file-name | awk '{print $5}' 的方式来获取文件大小?太麻烦啦。下面方式不是更好一些么:
stat -c%s your-file-name
直接得到文件大小。
(45)Linux shell获取0~9之间的随机数(方法来自《鸟哥的Linux私房菜》一书)
declare -i NUM=$RANDOM*10/32768 echo $NUM
(46)正则表达式排除指定的字符串
标题的含义是:你想写一个正则表达式,它要匹配一个字符串,但是这个字符串中不能含有你指定的另一个字符串(也就是把它排除掉),可以这样写:
^(?!.*string).*$
其中,string就是你要排除掉的字符串。
在上面的正则表达式的基础上改一改,就可以为你所用。举个例子,假设有字符串:
http://news.qq.com/1.html http://video.qq.com/2.html http://sports.qq.com/3.html
现在你想匹配所有“http://*.qq.com*”模式的字符串,但是,又想去掉“news.qq.com”这样的,那么可以这样写:
^(?!.*news).*\.qq\.com.*$
文章来源:http://www.codelast.com/
结果就是:第一行不会匹配上,后两行会匹配上。
再延伸一点:如果不仅想排除掉news,还想排除掉video,那么可以这样写:
^http:\/\/(?!news|video).*\.qq\.com.*$
再延伸一点:
如果不仅想排除掉news和video,而且还想指定xxx.qq.com中的“xxx”必须是0~9,a~z,或-(减号)中的任何字符,那么可以在上面的基础上再加一点匹配条件:
^http:\/\/(?!news|video)[a-z0-9\-]+\.qq\.com.*$
此正则是不会匹配上URL“http://a_b.qq.com/1.html”的,因为“a_b”中含有下划线,这不在上面规定的字符范围内。
(47)在Emacs中直接查看当前文件的svn diff
我们知道,在Linux命令行下可以用 svn diff file.txt 命令来查看file.txt的当前文件与版本库中的最新版本的差异,但是这样输出的文本是没有语法高亮的(当内容很多时,看起来眼都花了),我们只能把它重定向到一个diff文件中,然后再用Emacs或VIM之类的软件打开diff文件,这个操作过程非常麻烦。那么,如果已经用Emacs打开了file.txt,能否在Emacs中直接显示出它的SVN diff,从而可以用高亮方式来查看呢?强大的Emacs必然有这个功能。在Emacs 24中,不需要任何插件就可以实现,在打开file.txt的情况下,输入命令:
C-x v =
并回车,屏幕会自动一分为二,左边是file.txt的buffer,右边是它的svn diff结果,看起来太舒服了。如果跟版本库中的文件相比,file.txt没有任何修改的话,则在Emacs的mini buffer那里会显示出一句话:
No changes between working revision and workfile
(48)Ubuntu下Chrome字体太小的解决办法
在Ubuntu下,Chrome默认设置时,在我的PC上,某些网页字体在100%显示时非常小,看起来眼都要花了,但是如果单纯地靠放大网页来放大字体,有时候又会造成页面结构的错乱,因此,把Chrome的最小字体改大一点是个好方法,如下:
退出Chrome,备份Chrome配置文件:
cp ~/.config/google-chrome/Default/Preferences ~/.config/google-chrome/Default/Preferences.bak
修改其内容,找到“webkit”这一段,在类似于
"default_font_size": 16,
的这一行下面,添加一行:
"minimum_font_size": 15,
重新打开Chrome,发现字体很小的网页在100%显示时字体变大了。
(49)crontab中不支持嵌套命令
假设你在crontab中写了如下的命令:
31 14 * * * /home/codelast/a.sh `date -d yesterday +%Y-%m-%d` >> /home/codelast/a.log 2>&1
该命令的本意是向a.sh脚本传入一个类似于“2013-06-01”这样的字符串参数,但实际上该crontab不会执行成功,因为crontab中不支持嵌套命令(反引号中的命令),因此,如果你要达到这样的效果,可以把嵌套命令写在一个脚本中,只在crontab中调用那个脚本即可。
(50)Linux命令行下进行Base64解码
echo xxx | base64 --decode
其中,xxx是你要解码的字符串。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤
转载需注明出处:codelast.com
感谢关注我的微信公众号(微信扫一扫):