博航社区

 找回密码
 立即注册博航社区

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 5884|回复: 0
打印 上一主题 下一主题

shell脚本编程1 (博航辛工) [复制链接]

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2015-1-4 09:24:47 |只看该作者 |倒序浏览
分享到:
简介
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。
Shell有两种执行命令的方式:
        交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
        批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。
Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行。
Shell初学者请注意,在平常应用中,建议不要用 root 帐号运行 Shell 。不经意间 ,可能会对系统造成灾难的后果。
Bash
Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell。我们常说有多少种Shell,其实说的是Shell脚本解释器。

bash是Linux标准默认的shell,本教程也基于bash讲解。内部命令30多个。
很多传统的程序设计语言,例如Fortran、Ada、Pascal、C、C++和Java,都是编译型语言。这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。 运行程序时,直接读取目标代码(object code)。由于编译后的目标代码(object code)非常接近计算机底层,因此执行效率很高,这是编译型语言的优点。
但是,由于编译型语言多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象,往往实现一个简单的功能需要大量复杂的代码。例如,在C++里,就很难进行“将一个目录里所有的文件复制到另一个目录中”之类的简单操作。
解释型语言也被称作“脚本语言”。执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code),再由计算机运行。因为每次执行程序都多了编译的过程,因此效率有所下降。

使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象;缺点是它们的效率通常不如编译型语言。不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能用C或C++来编写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。脚本编程语言的例子有awk、Perl、Python、Ruby与Shell。
什么时候用shell
因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化。因此,Shell脚本只要“用心写”一次,即可应用到很多系统上。因此,之所以要使用Shell脚本是基于:
        简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。
        可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。
        开发容易:可以在短时间内完成一个功能强大又妤用的脚本。
但是,考虑到Shell脚本的命令限制和效率问题,下列情况一般不使用Shell:
1.        资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)。
2.        需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)。
3.        有跨平台(操作系统)移植需求(一般使用C 或Java)。
4.        复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)。
5.        对于影响系统全局性的关键任务应用。
6.        对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵、破解、恶意破坏等等。
7.        项目由连串的依赖的各个部分组成。
8.        需要大规模的文件操作。
9.        需要多维数组的支持。
10.        需要数据结构的支持,比如链表或数等数据结构。
11.        需要产生或操作图形化界面 GUI。
12.        需要直接操作系统硬件。
13.        需要 I/O 或socket 接口。
14.        需要使用库或者遗留下来的老代码的接口。
15.        私人的、闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)。
如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧——或许是Perl、Tcl、Python、Ruby——或者是更高层次的编译语言比如C/C++,或者是Java。即使如此,你会发现,使用shell来原型开发你的应用,在开发步骤中也是非常有用的。



第一个脚本程序
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。
建立test.sh,输入一些代码:
#/bin/bash
echo ”hello, world!”
“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于向窗口输出文本。

运行脚本的方式:
1.
chmod –x /test.sh
./test.sh
2. /bin/bash test.sh  (这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用)


下一个例子:
#!/bin/bash
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

chmod +x ./test.sh
$./test.sh
What is your name?
mozhiyan
Hello, mozhiyan
$

在stdin读取数据,在stdout 输出该数据。
变量
定义变量:
Shell支持自定义变量,定义变量时,变量名不加美元符号($),如:variableName="value"
注:变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
变量名的命名须遵循如下规则:
•        首个字符必须为字母(a-z,A-Z)。
•        中间不能有空格,可以使用下划线(_)。
•        不能使用标点符号。
•        不能使用bash里的关键字(可用help命令查看保留关键字)
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:
your_name="mozhiyan"
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
for skill in Ada Coffe Action Java
do
echo "I am good at ${skill}Script"
done
如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。推荐给所有变量加上花括号,这是个好的编程习惯。
重新定义变量
已定义的变量,可以被重新定义,如:
myUrl="http://see.xidian.edu.cn/cpp/linux/"
echo ${myUrl}
myUrl="http://see.xidian.edu.cn/cpp/shell/"
echo ${myUrl}
这样写是合法的,但注意,第二次赋值的时候不能写 $myUrl="http://see.xidian.edu.cn/cpp/shell/",使用变量的时候才加美元符($)
只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
#!/bin/bash
myUrl="http://see.xidian.edu.cn/cpp/shell/"
readonly myUrl
myUrl=http://see.xidian.edu.cn/cpp/danpianji/

运行结果为:
/bin/sh: NAME: This variable is read only.
删除变量
使用unset命令可以删除变量。语法:
unset variable_name
变量被删除后不能再次使用;unset 命令不能删除只读变量。
变量类型
运行shell时,会同时存在三种变量:
1) 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
特殊变量
前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。

变量        含义
$0        当前脚本的文件名
$n        传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#        传递给脚本或函数的参数个数。
$*        传递给脚本或函数的所有参数。
$@        传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?        上个命令的退出状态,或函数的返回值。
$$        当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。


例子:请看下面的脚本:
#!/bin/bash

echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"
运行结果:
$./test.sh Zara Ali
File Name: ./test.sh
First Parameter: Zara
Second Parameter: Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters: 2
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏0 转发到微博

使用道具 举报

Archiver|手机版|谷歌地图|百度地图|官网地图|淘宝链接|博航智能圈 - ARM嵌入式AI物联网IOT机器人

GMT+8, 2024-5-4 20:35 , Processed in 0.025621 second(s), 6 queries , Gzip On, Memcache On.

club.broadon.net

© 2007-2012 BroadOn

回顶部