`
chinachuner
  • 浏览: 64708 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Unix Shell Scripting之'扫盲篇'

阅读更多

Unix Shell Scripting之'扫盲篇' - [技术前沿]

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bigwhite.blogbus.com/logs/2390336.html

俗话说:"工欲善其事,必先利其器"。在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编程又很多经验和技巧,这需要在以后不断的实践中慢慢摸索了。


分享到:
评论

相关推荐

    Mastering UNIX Shell Scripting.pdf

    ### 关于《精通UNIX Shell脚本编程》的关键知识点解析 #### 一、UNIX Shell脚本编程概述 在《精通UNIX Shell脚本编程》这本书中,作者Randal K. Michael为读者提供了一套全面且深入的指南,旨在帮助系统管理员解决...

    Mastering Unix Shell Scripting

    本书详细介绍如何编写shell脚本来解决实际生活中遇到的UNIX问题和任务。本书面向所有的UNIX版本,重点覆盖对象包括AIX、Linux、HP-UX和Solaris操作系统。本书的每一章都以一个经常遇到的UNIX问题作为开始。对于...

    Mastering UNIX Shell Scripting_Sencond Edition_2008

    - **Bourne Shell**:作为最早期的Unix shell之一,Bourne shell对于理解shell的历史和发展至关重要。虽然它的功能相比现代shell较弱,但在许多老系统中仍然被广泛使用。 - **Korn Shell**:Korn shell结合了Bourne ...

    英文原版-Mastering Unix Shell Scripting 2nd Edition

    Bash, Bourne, and Korn Shell Scripting for Programmers, System Administrators, and UNIX GurusUNIX expert Randal K. Michael guides you through every detail of writing shell scripts to automate specific...

    Unix Oracle Shell Scripting

    ### Unix Oracle Shell Scripting #### 引言 本文旨在为读者提供一个在Oracle环境中进行Unix Shell脚本编写的起点。为了实现这一目标,本文被分为两个主要部分:“构建基础”和“实践示例”。其中,“构建基础”...

    Unix Shell Scripting.rar

    3 following books: (1)Classic.Shell.Scripting.pdf (2)Mastering Unix Shell Scripting.pdf (3)Unix Shell Programming. 3rd Ed.pdf

    Mastering UNIX Shell Scripting (Wiley, 2003)

    ### Mastering UNIX Shell Scripting (Wiley, 2003) #### 书籍概述 《Mastering UNIX Shell Scripting》是一本由Randal K. Michael撰写的书籍,于2003年由Wiley出版社出版。本书主要介绍了UNIX操作系统中的Shell...

    Automated testing using Unix Shell Scripting.pdf

    综上所述,《Automated testing using Unix Shell Scripting》不仅是一篇关于自动化测试的技术文档,更是一部指导测试人员如何充分利用Unix系统特性和Shell脚本语言,构建高效、稳定、可扩展的自动化测试体系的实用...

    Mastering UNIX Shell Scripting

    在IT领域,尤其是在系统管理和自动化任务执行中,UNIX Shell脚本编程是一项不可或缺的技能。《精通UNIX Shell脚本编程》一书,由Randal K. Michael撰写,旨在为读者提供全面深入的UNIX Shell脚本解决方案,帮助那些...

    Mastering UNIX Shell Scripting Sencond Edition

    总结,《精通UNIX Shell脚本编程 第二版》是一本全面介绍了Bash、Bourne和Korn Shell编程技术的专业书籍,通过详细的实例和深入浅出的讲解,帮助读者快速掌握Shell脚本编程的核心技能,并能够在实际工作中灵活运用。

    Mastering Unix Shell Scripting, 2nd Edition

    ### 知识点总结:《精通 Unix Shell 脚本编程 第二版》 #### 核心内容概览 本书《精通 Unix Shell 脚本编程 第二版》由 Randal K. Michael 编写,出版于 Wiley Publishing, Inc.。这本书主要针对 Unix 系统下的 ...

    Mastering UNIX Shell Scripting (John Wiley & Sons 2003).rar

    《Mastering UNIX Shell Scripting》是由John Wiley & Sons在2003年出版的一本专著,这本书深入探讨了UNIX/Linux环境下的Shell脚本编程技术。Shell脚本是Unix/Linux系统中的强大工具,它允许用户编写自动化任务,...

    Linux Shell Scripting Cookbook(3rd) mobi

    Linux Shell Scripting Cookbook(3rd) 英文mobi 第3版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书

    Shell Scripting

    A compendium of shell scripting recipes that can immediately be used, adjusted, and applied, The shell is the primary way of communicating with the Unix and Linux systems, providing a direct way to ...

    Linux.Shell_.Scripting.Cookbook | Classic_Shell_Scripting [pdf] 英文

    **Linux Shell脚本编程是Unix/Linux环境中不可或缺的一部分,它允许用户通过编写命令脚本来自动化日常任务,提高工作效率。本文将深入探讨"Linux Shell Scripting Cookbook"这本书中的关键知识点,包括Shell脚本的...

    Mastering Linux Shell Scripting

    Shell scripting is a quick method to prototype a complex application or a problem by automating tasks when working on Linux-based systems. Using both simple one-line commands and command sequences ...

Global site tag (gtag.js) - Google Analytics