资源描述:
《Linux SHELL脚本编程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、LinuxShell脚本编程LinuxSHELL脚本bash(BourneAgainShell):由GNU开发的Shell,主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,bash从csh和ksh借鉴了很多功能,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。虽然如此,bash和sh还是有很多不同的,一方面,bash扩展了一些命令和参数,另一方面,bash并不完全和sh兼容,有些行为并不一致,所以bash需要模拟sh的行为:当我们通过sh这个程序名启动bash时,ba
2、sh可以假装自己是sh,不认扩展的命令,并且行为与sh保持一致。用户的默认Shell设置在/etc/passwd文件中。如Ubuntu7.10的/bin/sh是指向/bin/dash的符号链接,dash也是一种类似bash的Shell一、Shell脚本语法1.条件测试:test[命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的ExitStatus为0,如果测试结果为假,则命令的ExitStatus为1(注意与C语言的逻辑表示正好相反)。例如测试两个数的大小关系:$VAR=2$test$VAR-gt1$echo$?0$tes
3、t$VAR-gt3$echo$?1$[$VAR-gt3]$echo$?1Table1测试命令:[-dDIR]如果DIR存在并且是一个目录则为真[-fFILE]如果FILE存在且是一个普通文件则为真[-zSTRING]如果STRING的长度为零则为真[-nSTRING]如果STRING的长度非零则为真[STRING1=STRING2]如果两个字符串相同则为真[STRING1!=STRING2]如果字符串不相同则为真[ARG1OPARG2]ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)-ne(不等于)-lt(小于)-le(小
4、于等于)-gt(大于)-ge(大于等于)之中的一个Table2带与、或、非的测试命令[!EXPR]EXPR可以是上表中的任意一种测试条件,!表示逻辑反[EXPR1-aEXPR2]EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示逻LinuxShell脚本编程[EXPR1-oEXPR2]EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或2.if/then/elif/else/fi和C语言类似,在Shell中用if、then、elif、else、fi这几条命令实现分支控制。这种流程控制语句本质上也是由若干条Shell命
5、令组成的,例如先前讲过的if[-f~/.bashrc];then.~/.bashrcfi其实是三条命令,if[-f~/.bashrc]是第一条,then.~/.bashrc是第二条,fi是第三条。如果两条命令写在同一行则需要用;号隔开,一行只写一条命令就不需要写;号了,另外,then后面有换行,但这条命令没写完,Shell会自动续行,把下一行接在then后面当作一条命令处理。和[命令一样,要注意命令和各参数之间必须用空格隔开。if命令的参数组成一条子命令,如果该子命令的ExitStatus为0(表示真),则执行then后面的子命令,如果Exit
6、Status非0(表示假),则执行elif、else或者fi后面的子命令。if后面的子命令通常是测试命令,但也可以是其它命令。Shell脚本没有{}括号,所以用fi表示if语句块的结束。见下例:#!/bin/shif[-f/bin/bash]thenecho"/bin/bashisafile"elseecho"/bin/bashisNOTafile"fiif:;thenecho"alwaystrue";fi:是一个特殊的命令,称为空命令,该命令不做任何事,但ExitStatus总是真。此外,也可以执行/bin/true或/bin/false得到
7、真或假的ExitStatus。Shell还提供了&&和
8、
9、语法,和C语言类似,具有Short-circuit特性,很多Shell脚本喜欢写成这样:test"$(whoami)"!='root'&&(echoyouareusinganon-privilegedaccount;exit1)&&相当于“if...then...”,而
10、
11、相当于“ifnot...then...”。&&和
12、
13、用于连接两个命令,而上面讲的-a和-o仅用于在测试表达式中连接两个测试条件,要注意它们的区别,例如,test"$VAR"-gt1-a"$VAR"-lt3和以下写法是等
14、价的test"$VAR"-gt1&&test"$VAR"-lt33.case/esacShell脚本的case可以匹配字符串和Wildcard,每个匹