Shell Script Programming.doc_第1页
Shell Script Programming.doc_第2页
Shell Script Programming.doc_第3页
Shell Script Programming.doc_第4页
Shell Script Programming.doc_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Shell Script Programming(SHELL脚本编程)版 本:V_1.0作 者:xgfone中文名:三界:天地人时 间:2011年10月14日56目录前 言1版 权2第一部分 词法预览31 控制字符.32 元字符.33 保留字.34 注释.3第二部分 Shell语法45 变量.46 简单命令.67 管道.78 列表.79 复合命令.810 函数.16第三部分 引用.1811 引用.1812 反斜杠转义字符序列.19第四部分 算术计算.2013 运算符.2014 算术扩展.2215 条件表达式.23第五部分 参数.2616 位置参数.2617 数组.28第六部分 扩展.3018 大括号扩展.3019 波浪线扩展.3020 参数扩展.3121 命令扩展.3322 算术扩展.3423 进程扩展.3524 单词分割.3625 模式匹配.37第七部分 重定向.3826 重定向.38第八部分 历史.4127 历史.4128 历史扩展.42第九部分 Readline.43 29 Readline.43第十部分 Shell内建命令.44 30 Shell内建命令.44第十一部分 环境变量.45 31 环境变量.45第十二部分 其他.46 32 作业控制.46 33 信号.4734 退出状态.4835 提示符.4936 控制字符.51附录.53参考书籍.54前 言本文是笔者在学习shell(bash)中整理出来的,其中的知识可能来源于某本书中,也可能来源于网上(笔者不清楚时,会上网搜索一下答案)。本文为1.0版本,几乎包括了大部分shell知识,但还没有包括shell的方方面面,还有待完善。出现加粗的红色“待写”二字(形如:待写)之处,均为有待完成。原则上,shell是相通的,尤其是遵循POSIX标准的;但是shell又有多种,每一种又有自己的特点,这就导致了不同shell之间的细微差别以及语法差别。笔者现在主要学习的是bash(GNU Bourne-Again Shell),所以本文整理的主要也是bash,以bash的man手册页所示为基准。正如前面所说,shell是相通的。所以,笔者假定,总体上本文中的内容适用于多种shell,但如果某些地方有冲突或问题,则表明该处内容不适用于您所用的shell,但肯定的是能适用于bash的。如果还有问题,可以与我联系:。对于shell,笔者还未完全精通,水平有限,本文可能有某些瑕疵、错误,欢迎各位好友指正。我的联系方式是:。版权 Shell Script Programming(Shell 脚本编程) Copyright (C) xgfone 2011This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.You should have received a copy of the GNU General Public License along with this program. If not, see .第一部分 词法预览1.控制字符| & & ; ; ( ) | |& 2.元字符元字符在没有引用时具有特殊含义| & ; ( ) space tab3保留字! case do done elif esac fi for function if inselect then until while time 注:保留字除其特有含义之外,不能另作他用。4.注释Shell中的注释以#开头,在#之后同行上的所有字符序列都将被shell忽略。#能在非交互式shell(如脚本)中正常使用,没有什么限制;但在交互式shell中有限制。要在交互式shell中使用#进行注释 ,必须启用interactive_comments选项;若没有启动该选项,交互式shell不允许进行注释。在交互式shell中,interactive_comments选项默认被启用。第二部分 shell语法5.变量在bash中,我们可以认为变量是没有类型的(这么说其实并不准确)。Bash变量是不区分类型的。本质上,bash变量都是字符串。实际上,我们并不需要为变量事先定义类型。默认情况下,所有变量都被看作字符串并以字符串来存储,即使它们被赋值为数值时也是如此。Shell和一些工具程序会在需要时把数值型字符串置换为对应的数值以对它们进行操作。变量其实是一个指向实际数据的指针。5.1 自定义变量5.1.1 变量名标识符是一串字符序列,该字符序列以一个字母或下划线开头,其后是任意长度的字母、数字或下划线字符。Bash变量名是一个标识符。变量名的字符长度并无限制。Shell变量可用来保存字符串值,所能保存的字符数同样没有限制。5.1.2 变量的声明与赋值在bash里,使用变量之前通常并不需要事先为它们做出声明。我们只是简单地通过使用它们(比如当我们给它们赋初值时)来创建它们。变量赋值的方式为:先写变量名称,紧接着写=字符,最后是新值(一般不需要引号,默认为字符串)。等号两边不能有任何空格。当所赋予的值内含有空白时,应加上引号。变量值可以是(而且通常是)空值,也就是不含任何字符。空值就是null。一个未初始化的变量将会是“null”值就是未赋值。空值不代表就是。在给变量赋值之前就使它,通常都会引起问题。5.1.3变量的使用在引用变量,变量前要加上美元符号($)。作为可选,也可以把变量放在大括号()里。一般而言,我们首先使用前一种,只有当变量名必须与其后的字符串区分开来时,才再加上大括号,以便区分出变量名。但这不是必须的,只要不出现错误就行。区别:加上大括号是通用的,去掉大括号后是有限制的。默认时,变量只有在执行该语句的shell自身内部才是可见的,对父shell和子shell是不可见的;可以把变量传递给在shell内调用的另一个程序(子shell),参见export内置命令。一旦一个变量被设置,只能使用unset内建命令来取消。6. 简单命令待写。7. 管道command1|command2 command2的标准输入是command1的标准输出. 列表(lists)被; & & |连接的一连串命令序列被称为“list”(列表)。语法作用cmd1 ; cmd2 在同一行上从左到右依次执行多条cmd;只有前条命令执行完毕后(不管是否执行成功),才能执行后一条命令。它的返回值是最后一条被执行的命令的退出状态。Cmd & 把命令cmd放到后台执行;各个在后台执行的命令互不影响。它的返回值是。Cmd1 & cmd2逻辑与(AND)。当且仅当cmd1执行成功(退出状态为)时,才会执行cmd2。它的返回值是最后一条被执行的命令的退出状态。Cmd1| cmd2 逻辑或(OR)。当且仅当cmd1执行失败(退出状态为非零)时,才会执行cmd2.它的返回值是最后一条被执行的命令的退出状态。. 复合命令复合命令有() () select case if for whileuntil等几种。其中,后种在其他编程语言中又称为“控制结构/语句“。.1 ( )命令语法:(lists)语义:该命令将引发当前shell产生一个子shell,该命令列表(lists)将在该子shell中执行。在命令完成之后,所有影响shell环境的变量参数和内建命令都不再继续有效。它的返回值就是命令列表的退出状态。.2 命令语法: lists; 语义:该命令组成一个命令块,该命令块在当前shell中执行。在大括号中的命令块必须以一个新行或分号来结束。它的返回值是命令块中最后一条被执行的命令的退出状态。元字符“”与“”是保留字,且必须出现在一个保留字被允许、被许可的地方。.3 ( )命令语法:(expression)语义:根据“算术运算”规则对expression进行计算。如果计算的结果是个非零值,则它的返回状态是;否则,为。该命令等价于let “expression”。小括号的两个左(右)部分之间不能有空白。9.4 命令语法:expression语义:根据条件表达式expression的计算结果,返回一个或。说明:单词拆分与路径名扩展在 中不被执行。使用时,大于操作符()、小于操作符()将根据本地区域设置进行逻辑排序。使用=和!=操作符时,操作符右边的字符串被认为是一个匹配模式,并根据模式匹配规则进行匹配。如果nocasematch选项被启用,匹配将不区分字母大小写。如果比较成立,则返回值为;否则,返回值为。匹配模式的任何一部分都应引起来,以促使它作为一个字符串进行匹配。9.if 语句.5.1 语法一: if condition ; then lists fi语义:如果条件表达式condition为真,则执行lists;否则,执行if语句后的命令。.5.2 语法二: if condition ; then lists_1 else lists_2 fi语义:如果条件表达式condition为真,则执行lists_1;否则执行lists_ 语法三: if condition_1 ; then lists_1 elif condition_2 ; then lists_2 elif condition_3 ; then lists_3 . elif condition_n ; then lists_n else lists_n+1 fi语义: 如果condition_1为真,则执行lists_1;否则,判断condition_2,如果condition_2为真,则执行lists_2;否则,判断condition_3,如果condition_3为真,则执行lists_3;否则,.依次类推;否则,判断condition_n,如果condition_n为真,则执行lists_n;否则,执行lists_n+1。说明:整个if.fi语句的返回值就是在then或else后面的最后一个被执行的命令的退出状态。如果无任何命令执行,则返回值为。在if后面不一定非得是test命令或者昌用于条件判断的中括号结构(或 ),只要能判断“真”“假”就行。“if COMMAND” 结构将会返回COMMAND的退出状态码。9.6 for语句9.6.1 语法一: for loop_variable in argument_list do lists done语义:for循环依次从argument_list参数列表中取出值赋值给loop_variable,然后执行lists;依次循环,直到argument_list中的参数被取完。For循环里的in列表是可选的。如果省略,shell循环会遍历整个命令行参数。返回值是最后一个被执行的命令的退出状态。如果argument_list为空,就不会执行任何命令,返回值为 语法二:for ( expr1; expr2; expr3 ) do lists done语义:首先,根据“算术运算”规则计算算术表达式expr1的值;然后,计算算术表达式expr2的值;如果expr2的值为非0(即为真),就执行循环主体lists;否则,结束for循环;计算算术表达式expr3;重复执行上述四步操作,直到for循环结束。如果算术表达式被省略了,则它的值就如同等于1(即为真)。返回值是循环主体中最后一条被执行的命令的退出状态。如果expr1,expr2,expr3中任何一个表达式无效,则返回值为false。9.7 while语句语法: while condition do lists done语义:while首先会检测condition的逻辑值,如果逻辑值为真,则执行lists;否则,退出while循环,执行while循环后的语句。重复上述操作,直到退出while循环。9.8 until语句语法: until condition do lists done语义:until同while,区别之处在于:当condition为假时,while继续循环;当condition为真时,until退出循环。9.9 case语句语法:case $variable in match_1 ) lists_1 ; match_2 ) lists_2 ; . match_n ) lists_n ; * ) # 匹配其他所有模式 Lists_n+1 ;esac语义:首先,$variable 将先被扩展;然后,从前到后(先列出的在前,后列出的在后)依次匹配给出的模式。如果找到了匹配,将执行相应的命令组,且不再匹配其他任何模式,即不执行其他匹配模式下的命令组。如果启用nocasematch选项,则匹配规则不再区分大小写;否则,严格区分大小写。如果使用 ; 操作符,在第一个匹配成功之后,如果使用 ;& 来替换 ; ,将继续执行下一个匹配模式的命令组;如果使用 ;& 来替换 ; ,将引发shell去测试下一个匹配模式;若匹配成功,将执行与之关联的命令组。说明:1、多个模式可以用“ | ”字符加以分隔以合并成一个模式 2、最后一个模式是可选的,它的表示除列出之外其他的所有情况。 3、如果找到一个匹配之后,不会再尝试其后的匹配。如果有匹配,整个case语句的返回值为执行序列中最后执行的命令的返回值;如果没有模式匹配,则返回值为0.9.10 select语句语法: select $variable in word do lists done语义:待写。9.11控制流命令有时需要从某个for或while循环中中断(break)或者继续(continue)执行下一个代码块,或者退出(exit)整个脚本,或者将函数执行结果返回(return)给调用函数的脚本。9.11.1 break语句用于结束包含该语句的循环或case语句。9.11.2 continue语句用于中断当前循环,将控制权转换移动下一次循环。9.11.3 exit语句将退出整个脚本或shell环境。可以在exit命令之后加上一个整数,该整数将作为返回代码发送给系统。9.11.4 return语句用于在函数中将数据返回,或返回一个结果或 代码给调用脚本。9.11.5 true和false分别表示真、假。9.11.6 shift命令用于将位置参数向左移动。如$1替换成$2,$3替换成$2,.依次类推。注:break、continue和shift都可以接受一个可选的整数参数,分别用来指出要中断继续、循环的层数或左移的个数;默认值均是1位。10 函数10.1 语法 function function_name lists 或 function_name ( ) lists 10.2 语义函数名的限制同变量名,参见“标识符”。当在脚本中编写函数时,必须记住要在使用之前对其进行声明或定义。函数部分必须在调用函数的命令语句之前。不能调用尚不存在的函数。在函数体中,位置参数($1、$2、.、$9、$#、$*、$)都是函数的参数。父脚本的参数则临时地被函数参数所掩盖或隐藏。$0依旧是父脚本的名称。当函数完成时,原来的命令行参数会恢复。基于历史原因,当它超过9时,就应该用大括号把数字括起来。函数的执行是在当前的shell脚本当中,而不是再另创建一个子shell。函数(至少在POSIX shell里)没有提供局部变量。因此所有的函数都与父脚本共享变量。如果在函数中声明的变量前加上locale,则该变量只能在该函数和它的调用者之间共享。在shell函数里,return和exit都可以退出函数。其中,exit会退出整个shell脚本;return会返回一个退出值给调用者,而不是直接退出整个shell脚本。函数会返回整数的退出状态值:零表示成功,非零表示失败。如果要返回其他的值,函数应设置一个全局性shell变量,或是利用父脚本捕捉它。函数可以递归的,且没有限制。第三部分 引用11 引用11.1 单引号()语法 作用 除了另有一个 之外,在 和 之间的所有字符按原样取出。11.2 反斜杠()语法 作用 c 对 后的特殊字符c进行转义,即对c按字面意思进行解释。11.3 双引号(”)语法 作用“ “ 除了下列字符保持其特殊含义之外,在”和”之间的所有字符都按原样取出。 $ 将发生变量置换 将发生变量置换 只有当其后跟着$、“、或时,“ ”才保留它的特殊含义。说明:如果历史机制被启用,除非在双引号中的 ! 被反斜杠转义字符()转义,否则历史扩展将完成。$sting 被特殊对待,它将扩展成string,其中的反斜杠转义字符将被C标准指定的代替。$”string”将引发字符串被转换,根据当前区域设置(“本地化”)。如果当前区域设置是C或POSIX,美元符号($)将被忽略。如果字符串被替换,则替换部分被双引号所引住。特殊字符*与在双引号中有特殊含义(位置参数)。12 反斜杠转义字符序列语法 语义 a alert(bell) 响铃 b backspace 退格 e an escape character 字符ESC f form feed 换页 n new line 换行 r carriage return 回车 v vertical tab 垂直制表符 t horizontal tab 水平制表符 backslash 反斜杠 single quote 单引号 ” double quote 双引号 nnn 一个八比特字符(n为八进制数) xHH H是十六进制值 cx 一个Ctrl-x字符第四部分 算术计算13 运算符bash使用来自C程序设计语言的算术运算符,优先级及使用方法等同于在C中。下面运算符的优先级依次从高到低(使用小括号时可不考虑优先级)。 运算符 含义 结合顺序 id+ id- 后置递增;后置递减 从左到右 +id -id 前置递增;后置递减 从右到左 + - 一元加号(即正);一元减号(即负) 从右到左 ! 逻辑非;二进制位求反 从右到左 * 乘幂 从左到右 * / % 乘;除;求模(即求余) 从左到右 + - 二元加号;二元减号 从左到右 按位左移;按位右移 从左到右 = = 小于等于;小于;大于等于;大于 从左到右 = != 等于;不等于 从左到右 & 按位与 从左到右 按位异或 从左到右 | 按位或 从左到右 & 逻辑与 从左到右 | 逻辑或 从左到右 ?: 条件表达式 从右到左 = 赋值 从右到左 += -= *= /= %= &= = |= = 复合赋值 从右到左说明:关系运算符( = = !=)产生的数字结果中,1表达为真,0表示为假。对逻辑“与”各“或”运算符而言,任何的非0值都为真,0为假。根据POSIX规定,算术运算符使用的是C的带有正负号的长整数。以0开头的常量被解释为八进制,以0x或0X开头的常量被解释为十六进制。所以,数字可以使用 base # n 械式,其中,base是一个2到64的用于表示算术基数的十进制数,n是在该基数下的数。如果base#省略,基数默认为10。如果base小于36,可以使用小写字母或大写字母来表示10到35的基数。 14 算术扩展14.1 $( expression ) 对expression进行计算,并替换该扩展。说明:算术表达式可以进行嵌套。如果expression是无效的,bash将打印一条信息来指明失败和没有置换发生的。14.2 let命令待写。15 条件表达式15.1 语法 test condition 或 condition 语义:求condition的值,如果值为“真”(即非零),则返回0退出状态;否则,返回非零退出状态。15.2 文件条件 运算符 如果.则为“真” -a file file文件存在(已经被“弃用“) -b file file文件存在且是一个块设备文件 -c file file文件存在且是一个字符设备文件 -d file file文件存在且是一个目录 -e file file文件存在 -f file file文件存在且是一个普通文件 -g file file文件存在且file的组ID位(setgid)已被设置 -h file file文件存在且file是一个符号链接 -k file file文件存在且file的粘贴位(sticky)已被设置(不再使用) -p file file文件存在且是一个命名管道(FIFO) -r file file文件存在且是一个可读文件(具有可读权限) -s file file文件存在且长度大于0,即不为空 -t n 文件描述符n被打开,且与一个终端设备相关联;默认时,n为1 -u file file文件存在且其用户ID位(setuid)已被设置 -w file file文件存在且是一个可写文件(即具有可写权限) -x file file文件存在且是一个可执行文件(即具有可执行权限) -G file file文件存在且其组是进程的有效组ID -L file file文件存在且是一个符号链接。同-h -N file file文件存在且从file上一次被读取到现在为止,file被修改过 -O file file文件存在且其拥有者是进程的有效用户ID -S file file文件存在且是一个套接字(socket) f1 -ef f2 文件f1和f2存在且f1和f2是硬链接(具有相同的设备和inode) f1 -nt f2 文件f1比f2新(根据修改日期);或f1存在,f2不存在 f1 -ot f2 文件f1比f2旧;或f1不存在,f2存在15.3 字符串条件 运算符 如果.则为“真” -n s1 串s1的长度为0,即s1非null -o s1 s1选项被设置。在set内置命令中描述shell选项 -z s1 串s1的长度为0,即s1为null s1 = s2 串s1和s2相等。=可用在与POSIX兼容的test命令中 s1 = s2 串s1和s2相等 s1 != s2 串s1和s2不相等 s1 s2 在字母表中(或使用其他排序),串s1比s2大,即s1排在s2 的后面15.4 数值比较 运算符 如果.则为“真” n1 -eq n2 n1等于n2 n1 -ne n2 n1不等于n2 n1 -ge n2 n1大于等于n2 n1 -gt n2 n1大于

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论