标签 Bash 下的文章

Unix Shell Scripting之'扫盲篇'

俗话说:"工欲善其事,必先利其器"。在Unix/Linux上做开发,这里的’器’也同样包括Unix Shell Script,遗憾亚,虽然自己在Unix上开发已经快2年了,但是对Unix Shell Script可以说是’Script盲’一个,很多稍微复杂些的Script自己根本都看不懂。其实这也是自己栽下的’苦果’,因为以前我一直’歧视’Script language,认为那不是真正程序员该精通的,所以也就没有认真钻研过。目前认识到了解一定的Script技术,可以很大程度提高自己的工作效率,有些小工具用Script实现方便极了。这里’扫盲’一是给自己’扫盲’,二是把这些基础的Script技术和那些对和我一样对Script不熟悉的人一起分享。这篇中的所涉及的Shell语法均为符合POSIX标准的语法,可能很多Shell不能与该语法完全相吻合。自己感觉Bash与POSIX Shell语法最为接近。

首先我们要知道Script Language属于’解释型’语言,其性能要逊于像C、C++这类的编译型语言。但是Script Language由于站在更高的层次,它编写相对简单,编写效率要高于编译型语言,用它来做一些系统管理和辅助性的工作绰绰有余。还有一点值得注意的是Shell script已经被标准化,这就意味着其可移植性相对较好,基本上是’Write Once, Run Everywhere’!

当你打开一个后缀为.sh的文件时,在文件的第一行一般有这样格式的字符串"#!usr/bin/xx",这种script文件叫’Self-Contained Script’,也就是说它可以像可执行程序那样被执行而不用你输入额外的字符,比如有这样的一个简单的’Self-Contained Script’:
/* helloworld.sh */
#! /usr/bin/bash
echo "hello world"
我们编辑完后,再赋予helloworld.sh可执行权限属性,这样我们就可以在命令行上敲入’helloworld’,’hello world’就输出到屏幕上了,更准确的说是标准输出上^_^。

Shell Script实际上是一组’命令’序列,它支持三种基本的命令:
内置命令 — 像cd、read、echo、printf等shell自己使用的一些命令;
Shell函数 — 用Shell Language写的函数,调用方式与外部命令相同;
外部命令 — Shell通过创建一个新的进程来运行这个命令,典型的’spawn’模式 — ‘fork + exec’.

既然Shell Script被称为一门语言,那么它也自然也不例外的拥有变量和相关的控制语句,我们逐一来学习一下。

[Shell变量]
1、定义变量:例如YOUR_VAR1=this_is_my_first_shell_var、YOUR_VAR2="this is my first shell var",对于变量值中间含有空格的,就按照YOUR_VAR2的定义方式,用双引号括上即可。注意在’='两边不允许有空格,否则会解释出错。
2、引用变量:例如echo $YOUR_VAR1、printf "${YOUR_VAR1} ${YOUR_VAR2}\n"、MY_VAR1=$YOUR_VAR1。在引用变量时最好用’{}’将你的变量括起来,否则当Shell解释器遇到这样的语句echo $YOUR_VAR1is,它就不认识了,修改成echo ${YOUR_VAR1}is后,则一切正常了。

[Shell环境变量]
每种Shell都有自己的环境变量,这些变量被该Shell下执行的程序所继承和共享,那我们如何定义环境变量呢?使用export命令。
export varname=value
或者
varname=value
export varname

例如:
/* 在环境变量文件中, Bash中为.bashrc,C Shell中为.cshrc */
hours_per_day=24
seconds_per_hour=3600
export hours_per_day
export seconds_per_hour

这样我们在命令行上敲入echo $hours_per_day后,我们就可以看到24输出在标准输出上了。

[条件分支判断]
Shell条件判断的语句格式:
if condition1
then
 statement1
 statement2
 ……….
elif condition2
then
 statement3
 statement4
 ……..   
else
 statement5
 ……..
fi

Shell Script支持多种判断condition的方法,如果在condition处是一个command, 那么如果该command执行成功,其退出状态(exit status)为0,否则为不等于0的值。当你既要获取command退出状态,而又不想要该command的输出时,有一个常用的技巧,那就是使用’/dev/null’文件设备。熟悉Unix编程的人都知道’/dev/null’文件的作用,这里不多说。看下面的例子:
#! /usr/bin/bash
if ls -l|grep myfile > /dev/null
then
        echo "myfile exists"
else
        echo "myfile doesn’t exist"
fi

在condition处我们大多数情况下都会利用test命令来判断condition,test命令有两种使用方式:
test operand1 operator operand2
或者是
[ operand1 operator operand2 ](省略test)

我们举例说明:

X=3
Y=6
if [ ${X} -lt ${Y} ]
then
        echo "${X} < ${Y}"
else
        echo "${X} > ${Y}"
fi

if test ${X} -lt ${Y}
then
        echo "${X} < ${Y}"
else
        echo "${X} > ${Y}"
fi

test命令提供的operator很是丰富,其中一目operator包括:
-n — operand non zero length
-z — operand has zero length
-d — there exists a directory whose name is operand
-f — there exists a file whose name is operand
二目operator包括:
-eq — the operands are integers and they are equal
-neq — the opposite of -eq
= — the operands are equal (as strings)
!= — opposite of =
-lt — operand1 is strictly less than operand2 (both operands should be integers)
-gt — operand1 is strictly greater than operand2 (both operands should be integers)
-ge — operand1 is greater than or equal to operand2 (both operands should be integers)
-le — operand1 is less than or equal to operand2 (both operands should be integers)

[循环语句]
和C语言类似,Shell也支持for、do..while loop,而且还支持break、continue这样的跳转语句。有了上面的基础理解这两组语句就不难了,看看例子一切都明白了。
e.g.-1
X=0
while [ $X -le 20 ]
do
        echo $X
        X=$((X+1))
done

e.g.-2
colour1="red"
colour2="blue"
colour3="green"
for X in "$colour1" "$colour2" "$colour3"
do
        echo $X
done

e.g.-3
colour4="red blue green"
for Y in $colour4
do
        echo $Y
done

这里e.g.-2和e.g.-3的输出是一样的。

[Shell函数]
Shell函数的定义与C语言也类似,格式如下:
[function] name ()
{
 command-list;
}
Shell Function的使用和外部command一样,不同的是Shell Fucntion运行在Shell进程上下文中,Shell在执行Shell Function时不另外启动一个新的进程。在Shell Function内部,Shell Fucntion参数屏蔽了其Parent Script的参数,见下面的例子:
/* test.sh */
#! /usr/bin/bash
printarglist ()
{
        echo ${1}
        echo ${2}
}
printarglist ${1} upload

执行:test.sh go download
输出:go upload

以上是Shell Script的基本语法结构,权当给自己’扫盲’了,当然Shell Script编程又很多经验和技巧,这需要在以后不断的实践中慢慢摸索了。

在Linux上工作

Linux上学习Linux内核我想应该是最好的方法了。Linux对我来说绝对是一个新鲜环境,搭建在Linux上的工作环境就是我的首要工作,这篇blog记录的就是我在Linux上的工作环境,也希望对大家有些借鉴意义。

我的Linux是在一个多月以前安装的[注1],安装的版本是Fedora Core 4。我使用的是本地磁盘映像安装,磁盘映像文件很大,总共4个,大约2.4G体积。安装过程倒是没有像网上很多人说得那样不顺利,包括修改、合并分区在内大约用了3个小时就看到Linux的桌面了。

进入Linux首先映入眼帘的的就是Linux桌面,我选择了GNOME(GNU Network Object Model Environment)桌面,不为什么,就是因为它流行。下一步就是熟悉这个新环境了,如基本的系统设置、网络设置以及个性化定制等,这些不详述。

工作环境是一个常用软件的集合,在Windows下自不必说了,那些软件都是耳熟能详了。但是在Linux下又有哪些软件可以作为替代品呢?带着这样的目的,我开始了搭建Linux工作环境的历程。另外王垠(http://learn.tsinghua.edu.cn:8080/2001315450)曾在其主页上介绍过不少好用的工具软件,这里很多软件也都是源于王垠的介绍。

Linux下的软件安装一般有两种方法:
(1) 通过rpm方式
安装:rpm -i your-package.rpm
卸载:rpm -e your-package

(2) 通过源代码编译方式
源代码编译三部曲:configure –> make –> make install

我的Linux工作环境
(1) 强大的Bash
以前在Solaris上开发使用的都是C shell,而Linux默认的Shell却是Bash Shell。我初始感觉Bash Shell与C Shell不同之处包括可以自动匹配补齐命令行、支持UP和DOWN ARROW来选择前一个和后一个命令行。对于一个非系统工程师的开发人员来说有一份得心应手的Shell配置文件足矣。下面是我的一份配置文件,简单而灵活,关键一点是它完全能够满足我的需求:
/* .bashrc */
# Tony Bai's .bashrc

#
# Source global definitions
#
if [ -f /etc/bashrc ]; then
        . /etc/bashrc   # –> Read /etc/bashrc, if present.
fi

#
# Greetings
#
echo "*********************************"
echo "***     This is Tony Bai      ***"
echo "*** Welcome to my linux world ***"
echo "*********************************"

function _exit()        # function to run upon exit of shell
{
        echo "********************"
        echo "***   Bye Bye!   ***"
        echo "*** Welcome Back ***"
        echo "********************"
}
trap _exit EXIT

#
# Export environment variables
#
CVSROOT=:pserver:tony@127.0.0.1:/export/home/cvs/CVS-ROOT
PROJDIR=/home/administrator/proj/example
PATH=.:$PATH:$HOME/bin:.local/bin

export CVSROOT
export PROJDIR

#
# User specific aliases and functions
#

# System command set
alias rm='rm -i'
alias mv='mv -i'
alias mkdir='mkdir -p'
alias h='history'
alias which='type -all'
alias ..='cd ..'
alias path='echo -e ${PATH//:/\\n}'
alias du='du -kh'
alias df='df -kTh'
alias la='ls -Al'               # show hidden files
alias ls='ls -hF –color'       # add colors for filetype recognition
alias lx='ls -lXB'              # sort by extension
alias lk='ls -lSr'              # sort by size
alias lc='ls -lcr'              # sort by change time
alias lu='ls -lur'              # sort by access time
alias lr='ls -lR'               # recursive ls
alias lt='ls -ltr'              # sort by date
alias lm='ls -al |more'         # pipe through 'more'

# Compile
alias gcc='gcc -Wall'

# System info Viewer
alias cpu='cat /proc/cpuinfo'
alias mem='cat /proc/meminfo'
alias version='cat /proc/version'
alias ipconfig='/sbin/ifconfig'

# Project info
alias cdinc='cd $PROJDIR/include'
alias cdsrc='cd $PROJDIR/src'

另外修改.bashrc后别忘了执行'bash'使配置修改生效。

(2) 输入法
毕竟是开发中文程序,中文输入发必不可少。虽觉得Fedora自带的“智能拼音”不错,但是“小企鹅输入法(free Chinese Input Toy for X)”的定制功能却让我更加垂涎。遂在小企鹅输入法网站上下载了专门为Fedora Core 4制作的rpm。安装后我们就可以修改~/.fcitx/config文件来订制你个性化的输入法了,如果你在Windows上使用微软输入法习惯了,我们完全可以把“小企鹅输入法”变成Linux上的“微软输入法”。

(3) 浏览器
无论在任何平台上我们都不能忽略网络世界的存在,在Windows上有IE,在Linux上我们有Mozilla Firefox这一新宠儿。关于Firefox的资料太多太多,我想这里就毋庸讳言了。

(4) 邮件工具
Evolution, 一款在使用习惯上颇为接近于Microsoft Outlook的邮件客户端及个人信息管理程序,如果你是用惯了Outlook的用户,那么Evolution将是你在Linux上的一个不错的选择。Evolution是Linux自带的程序,无需你下载安装了。

(5) 编辑器
对于一名程序员来说获得一得心应手的编辑器就好比如虎添翼一般。Linux给你提供了多种选择,既有图形界面的,又有基于终端的。不过VI/VIM仍然是我的最爱。

(6) 开发工具
由于做后台服务端开发,所以必不可少的需要Gcc, make等工具, Linux上还默认提供automake, autoconf等工具,免去了你手工编写Makefile的烦恼,不过要掌握这些工具也需要一个过程,自己权衡吧^_^。

(7) 词典工具
王垠在其文章中提到了WordNet,对该软件的新颖的概念很是感兴趣,遂down了一个,不过遗憾的是没有编译通过,至今未找到原因。

(8) 娱乐工具
程序员在工作之余都喜欢看看电影,而MPlayer又是被公认在Linux下最好的媒体播放软件。遗憾的是我的机器上没有声卡,不能听到MPlayer输出的优美音乐。

(9) 办公工具
由于公司的文档都是由微软的工具产生的,要想在Linux下阅读和修改可不是件容易事。试过了Linux自带的OpenOffice,PPT文档还可以,Word文档简直就不堪入目了。王垠推荐将Word等先转换为html网页再查看,我很懒嫌麻烦。想起金山最新推出的WPS2005在Windows下的效果还不错,希望金山也能尽快推出Linux下的WPS版本。来解决这一使用Linux办公的最大难题。

(10) 通讯工具
对于使用QQ的人,LumaQQ相信是最好的选择;而Gaim是一个支持多种IM协议的工具,只是上手不是很容易罢了。

初接触Linux,试用了上面的一些工具,还处于经验积累阶段。

[注1]
我是参考http://fedora.Linuxsir.org上的安装说明一步一步做的,感觉还不错。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats