Shell笔记(一)

最近一直在用Shell,也看了很多man页面,感觉GNU确实强大。举几个小例子。

首先要熟练运用Vim或者Emacs,我正在学Vim,Emacs是下个目标(话说我下了mit-scheme的安装包结果安装总出现问题,可能是链接的时候找不到某些库,不知道怎么弄,结果还是apt-get给解决了,唉。)

其次,Linux下很多工具都是有配置文件的,Vim是.vimrc,bash是.bashrc,mutt是.muttrc,.procmailrc,fetchailrc……

vim ~/.bashrc

可以去编辑一些常用的选项让bash更加易用。比如给环境变量$CDPATH加些路径,这样回到经常使用的目录时就不用输入完整的路径了。也可以定义一些简单的函数,比如下面这个计算阶乘的函数:

fac(){ seq 1 $1|(tr ‘\n’ ‘*’;echo 1)|bc;}

其中seqtr都是最简单的小工具,通过管道合组合起来就能实现一些实际常用的功能。如果要让修改的内容立即生效需要source一下。

常用的应用程序一般放在/usr/bin,/usr/local/bin,目录下,这些路径已经被加到了PATH变量中,所以直接在Shell下输入才可用。可以自己生成可执行文件并当作小工具使用。由于前天看了一本介绍正则表达式的书介绍了ISBN的末位校验的规则,于是无聊写了个isbn.c,然后编译后放到了/usr/bin下,效果不错,随便在豆瓣找了几本书ISBN都对着,支持ISBN-10和ISBN-13。以前一直不知道main函数的两个参数怎么用,这次自己真正用到的时候几乎不用别人教就会了。首先那个argc是命令行参数个数,没有任何参数时它是0,argv[0]表示第一个命令行参数,依此类推。但如果在当前目录下执行比如说./test,argv[0]就会是这个命令本身,反正会有点不一样。

还有一个将man页面输出为pdf格式的命令:

man -t command|ps2pdf -> comm.pdf

-t参数输出troff文档,这个不很了解。大概查了下,是70年代的东西。其他文档不知道怎么转化成troff格式然后变为pdf。

还有wget命令也不得不说,可以整个遍历下载一个网站的页面,比如我用这个命令下载了Java SE7的API文档。它有一个好处是可以把链接自动转化为本地的,这样就可以在离线时方便查阅。它还支持断点续传,只需加上-c参数。我那天在学校机房的XP下也试了下,不用安装,直接在解压的目录下用DOS命令下载。

wget -r download.oracle.com/javase/7/docs/api/

还有个md5sum的工具,计算一个文件的md5哈希值,安装mit-scheme时我怀疑是文件损坏了,下载时候超慢。后来看了md5值没有错。唉,真不知道哪里的问题了。不知道附带的.sig文件怎么用,是gpg用到的?

gpg也是个好东西,可以给一个文件加密,只有输入密码才能看到加密文件的内容。还不怎么会用。man页面都好长,这尼玛每个说明都那么长让哥怎么看。。。

pushd也比较有用,将目录放在堆栈里这样可以通过popd按原路返回。而一般的cd –只能存放一个目录。

还有很多小工具都很有趣和有用,慢慢去发现吧。

其实我觉得Linux的工作方式相对Windows来说在实质上是更简单的,比如我不会Python,但我想知道一段Python带码的运行结果,只要我装了python,只需要把代码复制到test.py中然后python test.py就行了。可以想象在Windows下要先去找一个支持Python的IDE,然后拼命去学怎么编译怎么运行。

总之,要学习Linux最好就是所有工作都用Linux来做,之前装VMware虚拟机什么的都是浮云,谁没事去给虚拟机搞那么多配置。短短的三周我学到了很多东西。

还有,最近学习正则表达式也初见成效,常见的命令都能看明白了,括号捕获,反向引用,环视,固化分组都能理解一些,匹配优先,忽略优先和占有优先也略懂一二,可以在Vim中比较熟练地进行一些查找替换。主要看的是《精通正则表达式》和《Regular Expressions Cookbook》,后者后来发现有中文版的。也会用Java的regex包写些简单的匹配。下一步把DFA,NFA的区别搞清楚,顺便学点Perl

Project Euler做了60+道,开学以来每星期十道左右,基本把简单题刷完了。几乎每到题都用到素数,以至于我都把isprime写成Vim模板了。额,还是sqrt(n)的算法,筛法虽简单但实现起来感觉还是不方便,不习惯。今天写了欧拉phi函数的求法,算到一百万几乎得运行一分钟,需要改进。

最近几道题是跟整数分划有关,比如求100的分化个数(PE76),我一开始是去网上搜,结果还真能搜到了答案(当然不是直接去搜题解)。OEIS是个好网站。其实动态规划的方法也不难理解,不过我还是没能力自己想出来。背包还是没能完全理解,过一段就要复习一下增强理解。PE31也可用这种方法解决,是同一个问题。

我不知道别人怎么做的,反正很多题我都用到了Java的BigInteger类,如果没学Java的话对我来说还真有难度。

Advertisements
上一篇文章
下一篇文章
留下评论

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: