《shell基础编程课件》由会员分享,可在线阅读,更多相关《shell基础编程课件(78页珍藏版)》请在金锄头文库上搜索。
1、shell基础编程主要内容shell脚本介绍shell特殊字符shell输入与输出shell变量算术运算控制结构函数Shell介绍Shell是一种具备特殊功能的程序,它是介于用户和UNIX/Linux操作系统的核心程序(kernel)间的一个接口程序。各种操作系统都有它自己的shell,DOS的shell就是文件;UNIX下有Bourne shell(/bin/sh)、C shell(/bin/csh)、Korn shell(/bin/ksh)、Bourne again shell(/bin/bash)、Tenex(tcsh)。shell介绍Shell程序( 脚本)相当于dos的批处理文件,可
2、简单到只有一条命令,也可以包括循环、条件语句、数学运算、文件测试、传送参数、控制结构的程序等,完成复杂的管理任务。Shell的另一个重要功用是提供个人化的用户环境,这通常在shell的初始化文件(.pro等)中完成,这些文件包括设置终端机键盘,定义窗口的特征,设置变量,定义查找路径、许可权限、提示符号和终端类型以及设置特殊应用程序所需要的变量。Shell脚本基本内容我们可以使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): # !/bin/sh.符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编
3、辑结束并保存后,如果要执行该脚本,必须先使其可执行: chmod +x 此后在该脚本所在目录下,输入 ./ 即可执行该脚本。shell中的特殊字符通配符 * ? ! 花括号 倒引号、单引号、双引号 “输入/输出重定向符 管道线 |其它符号: # ; & () & |正则表达式正则表达式在 shell、工具程序、Perl 语言中有非常重要的地位。正则表达式通过一些特殊符号表示特定的字符串模式。常见的特殊字符包括:字符 功能 置于待搜索的字符串之前,匹配行首的字$ 置于待搜索的字符串之后,匹配行末的字 匹配一个字的字尾. 匹配任意单个正文字符str 匹配字符串 str 中的任意单个字符str 匹配
4、不在字符串 str 中的任意单个字符a-c 匹配从 a 到 c 之间的任一字符* 匹配前一个字符的 0 次或多次出现 忽略特殊字符的特殊含义,将其看作普通字符正则表达式扩充的特殊字符:字符 功能+ 重复匹配前一项 1 次以上? 重复匹配前一项 0 次或 1 次j 重复匹配前一项 j 次j, 重复匹配前一项 j 次以上, k 重复匹配前一项最多 k 次j, k 重复匹配前一项 j 到 k 次s | t 匹配 s 或 t 中的一项(exp) 将表达式 exp 作为单项处理基本元字符集元字符含义只匹配行首$只匹配行尾*匹配0或多个字符 匹配 内字符屏蔽元字符的特殊含义.匹配任意单字符模式n匹配模式出
5、现次数,n模式n,m模式次数,至少为n模式n,m模式出现在n,m之间模式匹配: 正则表达式匹配行首/行尾行首:行尾:$举例查找当前目录下面所有子目录查找当前目录下面所有子目录ls -l|grep d查找文本文件中,以查找文本文件中,以a开头的行开头的行more a.txt |grep a查找文本文件中,以查找文本文件中,以a结尾的行结尾的行more a.txt |grep a$查找文本文件中,所有的空行查找文本文件中,所有的空行more a.txt |grep $模式匹配: 正则表达式匹配单个字符模式:.Eg:.abc.可以匹配可以匹配12abc34, ababc43等等cat a.txt |
6、 grep .abc.模式匹配: 正则表达式匹配0或多个字符模式:*Eg:abc12*可以匹配如下可以匹配如下abc123abc1424887612abc43Ababcdddcat a.txt | grep abc*模式匹配: 正则表达式匹配单词模式:功能:匹配完整的单词Eg:模式匹配: 正则表达式屏蔽特殊字符功能:将字符串中的特殊字符去掉特殊意义特殊字符$ . “ * | ( ) + ?eg:匹配包含匹配包含.字符的行:字符的行:.匹配包含匹配包含$的行的行: $匹配包含匹配包含的行:的行:模式匹配: 正则表达式匹配范围功能:匹配特定的字符串或字符串集Eg: 0123456789或或0-9:
7、匹配任意数字匹配任意数字A-Za-z:匹配任意字母匹配任意字母aa-zA-Zt:a开始任意字母开始任意字母t结尾结尾hHello:匹配匹配Hello或者或者hello0-9:匹配任一个非数字字符匹配任一个非数字字符a-zA-Z:匹配任一个非字母字符匹配任一个非字母字符模式匹配: 正则表达式匹配模式结果出现次数patternn匹配模式出现匹配模式出现n次。次。patternn,匹配模式出现最少匹配模式出现最少n次。次。patternn,m匹配模式出现匹配模式出现n到到m次之间,次之间,n , m为为0 - 255中任意整中任意整数。数。模式匹配: 正则表达式举 例A2BAABA4,BAAAAB,
8、 AAAAAB, AAAAAABA2,4BAAB,AAAB,AAAAB模式匹配: 正则表达式花括号 倒引号、单引号、双引号 实例区别 倒引号内的字符串会被shell解释为命令,会进行置换处理 单引号内的字符都当做普通字符处理 双引号内的字符除了$、倒引号()、反斜线()、感叹号(!)外,均作为普通字符处理倒引号双引号单引号双引号内使用倒引号单引号内使用单引号return管道线把一个命令的输出传递给另一个命令作为输入。eg:ls | sortcat func.txt | grep -v #重定向( , )与管道相关,可以改变程序运行的输入来源和输出地点 输入重定向 输出重定向输出重定向(追加)文
9、件重定向标准输出、输入及错误 在shell 中执行命令时,每个进程都和三个打开的文件相关联,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。文件文件描述符输入文件标准输入0(缺省是键盘,也可以是文件或其他命令的输出)输出文件标准输出1(缺省是屏幕,也可以是文件)错误输出文件标准错误2(缺省是屏幕,也可以是文件)文件重定向改变程序运行的输入来源和输出地点1. command 把标准输出重定向到一个新文件中2. command 把标准输出重定向到一个文件中(追加)3. command 1 把标准输出重定向到一个文件中4. command 2&1 把标准
10、输出和标准错误一起重定向到一个文件中5. command 2 把标准错误重定向到一个文件中6. command 2 把标准输出重定向到一个文件中(追加)文件重定向改变程序运行的输入来源和输出地点7. Command 2&1把标准输出和标准错误一起重定向到一个文件中(追加)8. Command command命令以文件作为标准输入,以 2文件作为标准输出9. Command delimiter 从标准输入中读入,直至遇到delimiter分界符10. Command &m把标准输出重定向到文件描述符m中12. Command2 $ date myfileeg2:command $ ls -l m
11、yfileeg3:command 1 $ ./test.sh 1 myfileeg4:command 2&1。 $ grep standard * grep.out 2&1说明:实际上可以看作 2 部分, (重定向标准输出)和2&1(把标准错误重定向到标准输出)。文件重定向举例eg5:command 2 。 $ find / -name *.tmp -exec rm -f ; 2 myfileeg6:command 2 $ find / -name *.tmp -exec rm -f ; 2 myfileeg7:Command 2&1 $ grep standard * grep.out 2&
12、1eg8:Command 2 $ cat 2.txt文件重定向举例eg9: Command myfile Hello there I am using a $TERM ternimal and my user name is $LOGNAME bye. MAYDAY 文件重定向举例shell 变量shell变量简介用户自定义变量数组位置变量环境变量变量的作用域shell变量简介shell程序中也使用变量。关于shell变量的几点说明:(1) shell变量无类型之分。默认情况下,shell变量中存放的内容均被当作字符串。(2) shell变量不需要预先定义。(3) shell变量名 由字母、数
13、字、下划线构成,以字母或下划线开头 区分大小写用户自定义变量(1) 变量的赋值、引用、取消(2) 变量的读入 赋值方式: 变量名=值 (注意: =两侧不能有空格!) 引用方式: $变量名 或 $变量名 取消: unset 变量名1 变量名2 read 变量名1 变量名2 变量赋值变量引用变量赋值变量引用变量取消说明: 若赋给变量的值含有空格、Tab键或换行符,则赋值时需要使用双引号!说明: 变量的值可以作为长字符串的一部分。 引用变量方式: $变量名 或 $变量名 当变量值必须出现在长字符串的开头或中间时,最好采用$变量名方式!变量引用变量引用变量引用说明: 可以将一个命令的执行结果赋值给变量
14、。有两种实现方式: 变量名=命令表 变量名=$(命令表)说明: 可以使用read命令读入数据赋给变量。 若一次为多个变量读入数据,数据之间以空格或Tab键间隔。数组bash只提供一维数组,且不限定数组的大小,也不需要预先声明。数组的下标从0开始编号,可以是整数或算术表达式。(1) 数组元素的赋值(2) 数组元素的引用 逐个数组元素赋值 数组名下标=值 整体赋值 数组=(值1 值2 值n) 单个数组元素 $数组名下标 所有非空数组元素 $数组名* 或 $数组名 为数组元素整体赋值. 为数组元素逐个赋值.为数组元素的引用. 其中, 表示数组中所有非空数组元素。位置变量在shell命令终端执行she
15、ll程序时,可以带有实参。与之相对应,在shell程序内部需要有“形参”与实参相对应。在shell程序中,对“形参”有专门的名称,即位置参数或位置变量。实例: 执行shell程序merge完成合并两个文件到一个文件bash merge a1 a2 aa$0 $1 $2 $3 $9 $10 $* 或 $与位置变量有关的特殊变量$#: (传递到脚本的参数个数)$*: (以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可超过9个)$: (脚本运行的当前进程 ID号)$!: (后台运行的最后一个进程的进程ID)$: (与$#相同,但是使用时加上引号,并在引号中返回每个参数)$-: (
16、显示shell使用的当前选项,与set命令功能相同)$?: (显示最后命令的退出状态。0表示没有错误,其它任何值表示有错误)算术运算执行整数算术运算的方式 方式1: (算术表达式) 方式2: let 算术表达式 方式3: expr 表达式方式1: (算术表达式)方式2: let 算术表达式说明:(1) 算术表达式的构成及语法规则(优先级、结合性等)与c语言相同。(2)(2) 在算术表达式中,变量名可以直接使用,不需要加$。(3)(3) 凡是使用方式2的地方都可以使用方式1取代。方式3: expr 表达式说明:(1) 使用expr命令只能进行简单的表达式运算。(2)(2) 使用expr命令进行算
17、术运算,运算符两侧必须有空格!否则,当作字符处理!(比较和可见)(3)(3) 默认情况下,expr命令的结果显示在屏幕上;若要保存到变量中,可借助倒引号! (比较和可见)方式3: expr 表达式说明:(1) 使用*作乘法运算时需使用转义字符。因为*是通配符。(比较和可见)(2) 使用expr命令时,引用变量要使用$! 这一点和(算术表达式)以及let 算术表达式不同!(由可见)浮点数运算bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk 处理。控制结构条件测试分支结构循环结构条件测试(1) 条件测试简介(2) 条件测试中表达式的构成(3) 特殊条件测试(1) 条件测试简介条
18、件测试的三种常用形式:形式1: test 表达式形式2: 表达式 形式3: 表达式 说明: 形式1和形式2完全等价; 形式3在一些处理上略有差别! 表达式的构成非常丰富: 可以是与数值相关的表达式、与文件相关的表达式、与字符串相关的表达式,还可以由逻辑运算符连接构成复杂的条件表达式。实例: shell程序test功能为: 根据命令行输入的年龄显示其范围。条件测试形式1条件测试形式2条件测试形式3(2) 条件测试中表达式的构成与文件有关的测试表达式与字符串有关的测试表达式与数值有关的测试表达式逻辑运算符文件状态测试格式:test 状态 或 状态举例test w student.txtecho $
19、? -x student.txt echo $? -e file 文件存在 -d directory 目录存在 -s file 文件大小大于0 -r file 文件可读 -b file 区块文件 -c file 字符文件 -f file 一般/正规文件 -w file 文件可写 -x file 文件可执行 -k file 设定了限定位 -g file 设定了组位 -u file 设定了user id -p file 管线字符串测试命令格式test stringtest string_operator stringtest string string_operator stringstring_
20、operator stringstring string_operator string举例 -z $LOGNAME -n $LOGNAME 操作符含义=相等!=不等-z空串-n非空串数值测试命令格式number numeric_operator number number numeric_operator number 举例 100 -lt 110 NUMBER=100 $NUMBER -ge 100 900 -le 910 -a 100 -gt 99 操作符含义-eq等于-ne不等于-gt大于-lt小于-le小于等于-ge大于等于逻辑操作符逻辑操作符-a 逻辑与逻辑与-o 逻辑或逻辑或!
21、逻辑否逻辑否举例 -x student.txt -a -w student.txt echo $? 分支结构(1) if命令(2) case命令(1) if命令if 测试条件then 命令组1else 命令组2fiif 测试条件then 命令组1elif 测试条件2then 命令组2else 命令组3fiif 命令组1then 命令组2else 命令组3fi语法格式1:语法格式2:语法格式3:说明: 如果写在一行上,则用分号(;)隔开!实例: shell程序test功能为: 根据命令行输入的年龄显示其范围。条件测试形式1条件测试形式2条件测试形式3(2) case命令case 变量 in模式字
22、符串1) 命令组1;模式字符串2) 命令组2;模式字符串n) 命令组n;模式字符串*) 命令组;esac语法格式:case语句#!/bin/sh#case test 1echo -n enter a number between 1 and 3 pls.:read NUMcase NUM in 1) echo you entered 1 ; 2) echo you entered 2 ; 3) echo you entered 3 ;Y|y) echo “you entered $NUM” ; *) echo basename $0 exit 1 ;esac示例:循环结构(1) while命令
23、(2) until命令(3) for命令(4) break命令和continue命令(1) while命令while 测试条件do 命令组donewhile 命令组1do 命令组2done语法格式1:语法格式2:while 语法1#!/bin/bashx=0while $x -lt 10 ;do y=$x while $y -ge 0 ; do echo -n $y y=expr $y - 1 done echo $x x=expr $x + 1donewhile语法2#!/bin/bashwhile read LINEdo echo $LINEdone test.txtuntil循环语法un
24、til 条件条件命令命令1命令命令2doneeg:#!/bin/sh#until test 2counter=0echo $counteruntil $counter -ge 100 do counter=expr $counter + 1 echo $counterdone条件发生在循环末尾,至少执行一次循环for 变量 in 值表do 命令组done语法格式1:for (表达式1;表达式2;表达式3)do 命令组done语法格式2:值表中的内容可以是: 多个字符串,以空格或Tab间隔 正则表达式 位置参数for循环 break命令和continue命令break 结束循环体continue
25、 结束本次循环,继续执行下一次循环#!/bin/sh#breakoutwhile :do echo n “Enter any number 15:”read ANScase $ANS in1|2|3|4|5)echo “您键入正确的数字.”;*)echo “错误的输入,是否继续(y/n)?”read IS_CONTINUEcase $IS_CONTINUE iny|yes|Y|YES)continue;*)break;esacesacdoneselect的用法select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择: select var in . ; d
26、obreak;done. now $var can be used .举例#!/bin/shecho What is your favourite OS?select var in Linux Gnu Hurd Free BSD Other; dobreak;doneecho You have selected $var函数shell中的函数shell中的函数定义和使用shell中的函数可以把若干命令结合在一起,编写成函数,供shell调用。调用时使用函数名即可。可以带有参数。特别说明: 执行函数时并不创建新的进程,而是通过shell进程执行。这一点与执行shell脚本程序是不同的。 shell中的函数定义和使用function 函数名() 命令组语法格式:说明:(1) 函数要先定义,后使用!(2) 调用时,直接使用函数名,不需要带圆括号!(3) 如需传递参数,可以通过变量和位置参数直接传递!例1: 用变量传递参数#!/bin/bash#ave :compute average of arryave () sum=0 for (i=0;i0;n-) do echo $1 shift donedisp abc bcd常用命令