仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 632|回复: 8
打印 上一主题 下一主题

[shell编程] 来讲讲:Centos Shell编程入门

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 21:04:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
小知识:Linux发展和成长过程始终依赖着五个重要支柱:UNIX操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet网络。
从法式员的角度来看,Shell自己是一种用C说话编写的法式,从用户的角度来看,Shell是用户与Linux操作体系沟通的桥梁。用户既可以输出敕令履行,又可以应用Shell剧本编程,完成加倍庞杂的操作。在LinuxGUI日趋完美的明天,在体系治理等范畴,Shell编程依然起着弗成疏忽的感化。深刻地懂得和闇练地控制Shell编程,是每个Linux用户的?作业之一。
Linux的Shell品种浩瀚,罕见的有:BourneShell(/usr/bin/sh或/bin/sh)、BourneAgainShell(/bin/bash)、CShell(/usr/bin/csh)、KShell(/usr/bin/ksh)、ShellforRoot(/sbin/sh),等等。分歧的Shell说话的语法有所分歧,所以不克不及交流应用。每种Shell都有其特点的地方,根本上,控制个中任何一种就足够了。在本文中,我们存眷的重点是Bash,也就是BourneAgainShell,因为易用和收费,Bash在平常任务中被普遍应用;同时,Bash也是年夜多半Linux体系默许的Shell。在普通情形下,人们其实不辨别BourneShell和BourneAgainShell,所以,鄙人面的文字中,我们可以看到#!/bin/sh,它异样也能够改成#!/bin/bash。
应用vi等文本编纂器编写Shell剧本的格局是固定的,以下:
#!/bin/sh
#comments
Yourcommandsgohere
首行中的符号#!告知体系厥后路径所指定的法式等于说明此剧本文件的Shell程序。假如首行没有这句话,在履行剧本文件的时刻,将会涌现毛病。后续的部门就是主法式,Shell剧本像高等说话一样,也有变量赋值,也有掌握语句。除第一行外,以#开首的行就是正文行,直到此行的停止。假如一行未完成,可以外行尾加上",这个符号注解下一行与此行汇合并为统一行。
编纂终了,将剧本存盘为filename.sh,文件名后缀sh注解这是一个Bash剧本文件。履行剧本的时刻,要先将剧本文件的属性改成可履行的:
chmod+xfilename.sh
履行剧本的办法是:
./filename.sh
上面我们从经典的“helloworld”动手,看一看最简略的Shell剧本的容貌。
#!/bin/sh
#printhelloworldintheconsolewindow
a="helloworld"
echo$a
ShellScript是一种弱类型说话,应用变量的时刻无需起首声明其类型。新的变量会在当地数据辨别配内存停止存储,这个变量归以后的Shell一切,任何子进程都不克不及拜访当地变量。这些变量与情况变量分歧,情况变量被存储在另外一内存区,叫做用户情况区,这块内存中的变量可以被子过程拜访。变量赋值的方法是:
variable_name=variable_value
假如对一个曾经有值的变量赋值,新值将代替旧值。取值的时刻要在变量名前加$,$variable_name可以在引号中应用,这一点和其他高等说话是显著分歧的。假如涌现混杂的情形,可使用花括号来辨别,例如:
echo"Hi,$as"
就不会输入“Hi,helloworlds”,而是输入“Hi,”。这是由于Shell把$as当做一个变量,而$as未被赋值,其值为空。准确的办法是:
echo"Hi,${a}s"
单引号中的变量不会停止变量调换操作。
关于变量,还须要晓得几个与其相干的Linux敕令。
env用于显示用户情况区中的变量及其取值;set用于显示当地数据区和用户情况区中的变量及其取值;unset用于删除指定变量以后的取值,该值将被指定为NULL;export敕令用于将当地数据区中的变量转移到用户情况区。
上面我们来看一个更庞杂的例子,联合这个例子,我们来说述ShellScript的语法。
{C}1#!/bin/bash
2#wehavelessthan3arguments.Printthehelptext:
3if[$#-lt3];then
4cat<<HELP
5ren--renamesanumberoffilesusingsedregularexpressions
6
7USAGE:renregexpreplacementfiles


8EXAMPLE:renameall*.HTMfilesin*.html:
9renHTM$html*.HTM
10
11HELP
12exit0
13fi
14OLD="$1"
15NEW="$2"
16#Theshiftcommandremovesoneargumentfromthelistof
17#commandlinearguments.
18shift
19shift
20#$*containsnowallthefiles:
21forfilein$*;do
22if[-f"$file"];then
23newfile=`echo"$file"|sed"s/${OLD}/${NEW}/g"`
24if[-f"$newfile"];then
25echo"ERROR:$newfileexistsalready"
26else
27echo"renaming$fileto$newfile

"
28mv"$file""$newfile"
29fi
30fi
31done


我们从头来看,后面两行上一个例子中曾经说明过了,从第三行开端,有新的内容。if语句和其他编程说话类似,都是流程掌握语句。它的语法是:
if…;then

elif…;then

else

fi
与其他说话分歧,ShellScript中if语句的前提部门要以分号来分隔。第三行中的[]表现前提测试,经常使用的前提测试有上面几种:
[-f"$file"]断定$file能否是一个文件
[$a-lt3]断定$a的值能否小于3,异样-gt和-le分离表现年夜于或小于等于
[-x"$file"]断定$file能否存在且有可履行权限,异样-r测试文件可读性
[-n"$a"]断定变量$a能否有值,测试空串用-z
["$a"="$b"]断定$a和$b的取值能否相等
[cond1-acond2]断定cond1和cond2能否同时成立,-o表现cond1和cond2有一成立
要留意前提测试部门中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧异样也有空格。假如没有这些空格,Shell说明剧本的时刻就会失足。
$#表现包含$0在内的敕令行参数的个数。在Shell中,剧本称号自己是$0,剩下的顺次是$0、$1、$2…、${10}、${11},等等。$*表现全部参数列表,不包含$0,也就是说不包含文件名的参数列表。
如今我们明确第三行的寄义是假如剧本文件的参数少于三个,则履行if和fi语句之间的内容。然后,从第四行到第十一行之间的内容在ShellScript编程中被称为Here文档,Here文档用于将多行文本传递给某一敕令。Here文档的格局是以<<开端,后跟一个字符串,在Here文档停止的时刻,这个字符串异样也要涌现,表现文档停止。在本例中,Here文档被输入给cat敕令,也行将文档内容打印在屏幕上,起到显示赞助信息的感化。
第十二行的exit是Linux的敕令,表现加入以后过程。在Shell剧本中可使用一切的Linux敕令,应用下面的cat和exit,从一方面来讲,闇练应用Linux敕令也能够年夜年夜削减Shell剧本的长度。
十4、十五两句是赋值语句,分离将第一和第二参数赋值给变量OLD和NEW。紧接上去的两句是正文,正文上面的两条shift的感化是将参数列表中的第一个和第二个参数删除,前面的参数顺次变成新的第一和第二参数,留意参数列表本来也不包含$0。
然后,自二十一行到三十一行是一个轮回语句。ShellScript中的轮回有上面几种格局:
while[cond1]&&{||}[cond2]…;do

done
forvarin…;do

done
for((cond1;cond2;cond3))do

done
until[cond1]&&{||}[cond2]…;do

done
在下面这些轮回中,也能够应用相似C说话中的break和continue语句中止以后的轮回操作。第二十一行的轮回是将参数列表中的参数一个一个地放入变量file中。然落后入轮回,断定file能否为一个文件,假如是文件的话,则用sed敕令搜刮和生成新的文件名。sed根本上可以算作一个查找调换法式,从尺度输出,例如管道读入文本,并将成果输入到尺度输入,sed应用正则表达式停止搜刮。在第二十三行中,backtick(`)的感化是掏出两个backtick之间的敕令输入成果,在这里,也就是将成果掏出赋给变量newfile。尔后,断定newfile能否曾经存在,不然就把file改成newfile。如许我们就明确这个剧本的感化了,ShellScript编写的其他剧本与此类似,只不外是语法和用法稍有分歧罢了。
经由过程这个例子我们明确了ShellScript的编写规矩,但还有几件工作须要讲述一下。
第一个,除if语句以外,ShellScript中也有相似C说话中多分支构造的case语句,它的语法是:
casevarin
pattern1)
…;;
pattern2)
…;;
*)
…;;
esac

我们再就上面一个例子,看看case语句的用法。
whilegetoptsvc:OPTION
do
case$OPTIONin
c)COPIES=$OPTARG
ehco"$COPIES";;
v)echo"suyang";;
?)exit1;;
esac
done
下面的getopts相似于C说话供给的函数getopts,在ShellScript中,getopts常常和while语句结合起来应用。getopts的语法以下:
getoptsoption_stringvariable
option_string中包括一串单字符选项,若getopts在敕令行参数中发明了连字符,那末它会将连字符以后的字符与option_string停止比拟,若婚配胜利,则把变量variable的值设为该选项,若无婚配,则把变量的值设为?。有时刻,选项还会带一个值,例如-c5等,这时候要在option_string中该选项字母前面加上一个冒号,getopts发明冒号后,会读取该值,然后将该值放入特别变量OPTARG中。这个敕令比拟庞杂,若有须要,读者可以具体参阅Shell编写的相干材料。
下面这个轮回的感化就是顺次掏出剧本称号前面的选项,停止处置,假如输出了不法选项,则进入"?指定的部门,加入剧本法式。
第二个,Bash供给了一种用于交互式运用的扩大select,用户可以从一组分歧的值中停止选择。其语法以下:
selectvarin…;do
break;
done
例如,上面这段法式的输入是:
#!/bin/bash
echo"Yourchoice?"
selectvarin"a""b""c";do
break
done
echo$var
----------------------------
Yourchoice?
1)a
2)b
3)c
第三,ShellScript中也能够应用自界说的函数,其语法情势以下:
functionname()
{

}
例如我们可以把下面第二个例子中第四到第十二行放入一个名为help函数体内,今后每次挪用的时刻直接写help便可。函数中处置函数挪用参数的办法是,直接用下面讲过的$1、$2来分离表现第1、第二个参数,用$*表现参数列表。
第四,我们也能够在Shell下调试ShellScript剧本,固然最简略的办法就是用echo输入检查变量取值了。Bash也供给了真实的调试办法,就是履行剧本的时刻用-x参数。
sh?xfilename.sh
这会履行剧本并显示剧本中一切变量的取值,也能够应用参数-n,它其实不履行剧本,只是前往一切的语法毛病。
小知识:CentOS其实就是相当于免费版的RedHat,任何人可以自由使用,不需要向RedHat付任何的费用。当然,同样你也得不到任何有偿的技术支持和升级服务。
若相依 该用户已被删除
沙发
发表于 2015-1-16 23:37:53 | 只看该作者

来讲讲:Centos Shell编程入门

眼看这个学期的Linux课程已经告一段落了,我觉得有必要写一遍心得体会来总结一下这学期对着门课程的学习。
小女巫 该用户已被删除
板凳
发表于 2015-1-24 07:06:27 | 只看该作者
应对Linux的发展历史和特点有所了解,Linux是抢占式多任务多用户操作系统,Linux最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具。
冷月葬花魂 该用户已被删除
地板
发表于 2015-2-1 06:50:21 | 只看该作者
Windows?是图形界面的,Linux类似以前的?DOS,是文本界面的,如果你运行了图形界面程序X-WINDOWS后,Linux?也能显示图形界面,也有开始菜单、桌面、图标等。
admin 该用户已被删除
5#
发表于 2015-2-7 03:58:21 | 只看该作者
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
飘飘悠悠 该用户已被删除
6#
发表于 2015-2-21 01:31:19 | 只看该作者
Linux高手更具有鼓励新手的文化精神。如何在Linux社区获得帮助,需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问。
小魔女 该用户已被删除
7#
发表于 2015-3-6 19:56:06 | 只看该作者
熟悉并掌握安装Linux,安装是学习的前提。目前较常见的安装方法有二种:
柔情似水 该用户已被删除
8#
发表于 2015-3-13 09:07:25 | 只看该作者
一定要学好命令,shell是命令语言,命令解释程序及程序设计语言的统称,shell也负责用户和操作系统之间的沟通。
9#
发表于 2015-3-13 09:08:33 | 只看该作者
清楚了解网络的基础知识,特别是在Linux下应用知识,如接入internet等等。
灵魂腐蚀 该用户已被删除
10#
发表于 2015-3-20 18:40:24 | 只看该作者
可以说自己收获很大,基本上完成了老师布置的任务,对于拔高的题目没有去做,因为我了解我的水平,没有时间和精力去做。?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-12 18:36

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表