




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Elegon 技术文档 v1.0Shell 编程John.jiao2009/11/261 Shell基础1.1 什么是命令命令是一个可以执行的程序。1. 命令的分类简单命令 date , ls 等复杂命令:有命令名和参数列表组成的命令$who am I 复合命令:一组被(;)隔开的简单和复杂命令组成。$ date;uptime;who命令分隔符:1.2 什么是shell2. Shell是unix 系统的命令解释器,shell 提供一个到unix系统的接口,它收集输入并根据输入来执行程序,当一个程序执行结束后,它显示程序的输出。3. Shell 提示符 $ % #。4. Shell的类型在unix中主要有两种shella) Bourne shell (包括sh,ksh,bash)Korn shell (ksh), bourne again shell(bash),korn shell (ksh),POSLX shellBourne shell 是70年代由Stephen R.Bourne编写的。它是unix系统上出现的第一个shell。b) C shell(包括csh,tcsh)C shell, TENEX/TOPS C shell(tcsh)C shell是由bill Toy在80年代早期在加州大学伯克利分校开发的。问题讨论:1. 把下面按简单命令,复杂命令,复合命令分类$ls$date;uptimeLs lEcho “hello world”2. Who am I 和 who am I; 有区别吗3. 两种主要类型的shell是什么,请举例说明2 脚本基础主要介绍shell是什么,它是如何工作的。2.1 unix系统包括两部分a) 工具工具是指能够运行或执行的程序。几乎每一个程序都可以称为工具。比如Date,ls命令和工具略有不同,命令是程序和为了改变程序行为而声明的参数。比如 date ls-l who am I, ls;date等b) 内核内核是unix系统的心脏,它给工具提供访问机器硬件的方式。还处理命令的调度和执行。2.2 Shell 初始化当执行某一程序时,这个shell还没初始化,但shell 还没初始化时,shell正常运行需要的一些参数还没有设置。Shell初始化需要两步:1) /etc/profile检查profile是否存在,如果存在shell读取其中信息,不存在,就被略过。不显示错误。2) .profile检查用户起始目录下.Profile是否存在,如果存在,读取信息,不存在,不显示错误信息。3) 当文件都被读取后,显示命令提示符:$2.3 执行shell脚本创建test.sh脚本在脚本里输入date;ls命令为了能正确执行test.sh脚本。我们需要: Chmod +x test.sh 在脚本开头增加一行: #!/bin/sh ? 没有这一行,不管是那种脚本写得,都调用当前的shell执行脚本。这并不是注释。在shell脚本里面,开头为#的,默认为是注释行。2.4 怎样获取帮助man commod问题讨论:1. shell初始化时,使用哪两个文件?2. 在脚本中加一句#!/bin/sh的目的是什么3 命令基础3.1 问题讨论:1. 拷贝 一个当前目录的文件夹 到 另一个文件夹。Cp -r dir1 dir22. 统计一个文件的行数,单词数,字符数。Wc l w -c file 3. 统计一个文件夹下面有多少文件。Ls l dir |wc -l4. 查找当前目录下全部的 txt文件Find . name “*.txt” print5. Vi下把一个文件里面的oracle全部替换成name:1,$s/s1/s2/g 或是:g/s/s1/s2/g6. Vi 下 把1到5行复制到7行:1,5 copy 67. 查询一个文件的前后5行Head/tail -5 file8. 修改文件的操作时间Touch yyyyMMDDHHMM file9. 把一个文件夹下的文件信息输入到test.log文件Ls l dir test.log10. 通过命令分辨出哪些是文件夹,哪些是文本。Ls F dir11. 删除一个文件夹包括子文件夹。Rm r dir12. 把一个.zip文件解压到 指定目录Unzip *.zip d dir13. 解压一个cpio文件Cpio idcmv file120. 查找当前目录下权限是 777的文件并删除。Find . -perm 777 exec rm ;4 Shell 编程4.1 变量1. 变量名变量名由字母,数字,下划线组成。变量名只能友字母和下划线开头比如:_fruit fruit 4.1.1 定义标量Name=valueFruit=apple在Bourne shell 中只支持标量。而在Korn shell 扩展了变量的功能。而在bourne again shell 或更高版本中,也支持数组变量。2. 删除变量Unset name3. 访问变量4. $fruit4.1.2 定义数组变量Fruit0=appleFruit1=orangeFruit_0=apple5. 访问数组变量$fruit0$fruit*6. 定义只读变量Fruit=appleRead only Fruit4.2 Shell中的变量Shell在运行时,存在三种变量:A. 局部变量:当前shell实例中存在的变量。B. 环境变量:Shell的任何子进程都能使用的变量。C. shell变量shell设置的特殊变量。也是shell正确运行所必须的。这些变量有些是局部变量有些是环境变量。 比如 PATH ,HOME PWD REPLY 等等。问题讨论:1. shell中有几种变量?2. 怎样访问这些变量?5 Shell 编程5.1 If语句5.1.1 If语句的基本语法是:If listThen List2Else If list3 Then Fi Fi5.1.2 If 实例: 1. if $name = then echo $name else echo $name 123fi 2. if -d /export/home then echo this is a $nameelse echo this is a empty stringfi3. if $name = jiao1 then echo this is jiao1elseif $name = jiao2 then echo this is jiao2 elseelse if $name = jiao then echo this is jiao .aaafififi if表达式有四种类型:a) 文件测试-d file 文件是文件夹为真-b file 文件是特殊块文件为真-s file /文件大小大于0为真-p file /文件是管道类型为真-r file / 文件是可读文件为真-c file /文件是字符特殊文件为真-e file /文件存在为真-ufile / 文件设置suid为为真b) 字符串比较-z string / 判断长度为0-n string / 判断长度不为0Str1 = str2 /判断两个字符串相同Str1 != str2c) 数字比较Int1 eq int2Int1 ne int2Int1 lt int2Int1 le int2Int1 gt int2Int1 ge int2d) 复合表达式、!expr expr1 a expr2 两个都为真,则表达式为真expr1 o expr2 两个有一个为真,则为真复合表达式实例If -z $name a d “/export/home” Then Mkdir /export/home/$namefi5.2 case 语句:5.2.1 case 语句语法:case word in pattern1) list1 ; pattern2) list ; *) list3 ; esac5.2.2 Case语句的实例 case $name in jiao) echo case :this is jiao ; jaio1) echo this is not jiao ; esac 问题讨论:1.if -x “/export/home” then /usr/local/bin/bash fiif -e “/export/home” then /usr/local/bin/bash fi有什么不同。 2. 为测试/usr/bin是一个目录还是符号链接,应该怎样使用test命令?5.3 循环语句5.3.1 While循环5.3.2 While循环语法while commod do list done5.3.3 while 循环实例x=0while $x lt 10 do echo $x x= echo “ $x +1 ” | bc done5.4 until 循环只有在ksh和bash中才可以执行until循环。5.4.1 Until循环语法 Until commod Do List Done5.4.2 Until 循环实例X=1Until $x lt 10 Do Echo “$x”X=echo “ $x + 1” |bcDone5.5 For循环一种比较常用的循环方式5.5.1 For循环语法For name in word1.wordnDo ListDone5.5.2 For 循环实例 # for 循环for i in 1 2 3 4 5 6 7 8 9 do echo $idone 实例二: cd /export/home/oracle/testif -d jiao then rmdir jiao else rm -r jiao fimkdir jiao# for 循环 例子#在写程序时,一定要注意格式,比如if后面要有空格和 ,而 内的元素都要用空格隔开。 then 要在if 的另一行,fi 结束位置要合理#for file in * do if -d $file then if $file = jiao then echo jiao can not copy else echo $file cp -r $file jiao echo $file is a dir fi else echo $file cp $file jiao echo copy $file to jiao fi done5.6 Select循环Select 循环提供一种从用户可选项中创建已编号菜单的简捷方式。但要求用户从一个选项清单中选择一项或多项时,该循环很有用。5.6.1 Select循环语法Select name in wordl word2.wordnDo ListDone5.6.2 Select 循环实例Select compent in comp1 comp2 comp3 Do Case $compent in Comp1) list ; Comp2) list2 ; All) list3 ; None) break ; *) ehco “ error” ; Esac done5.7 循环控制5.7.1 Break命令和java中的break一样,当执行break命令时,程序将退出整个循环。5.7.2 Continue命令和java中的contine一样,但执行到contine命令时,程序将退出这次循环,继续执行下一循环。5.8 Shell参数5.8.1 特殊变量1) $0 正在被命令执行的名字2) $n 该变量和脚本激活时所带的参数相对应。3) $# 提供脚本的参数个数4) $ 等同于$ = $1$2 5) $* 等同于$ = $1$2 6) $! 前一个后台命令的进程号7) $ 当前shell 的进程号8) $? 前一命令执行后的退出状态5.8.2 特殊变量实例 if $# -lt 2 #参数个数 then echo 参数小于2 else echo 参数大于等于2 fi if $? -eq 0 #前一命令退出后的状态then echo commod execute successfiecho 正在执行 $0 #在执行的命令的名字echo 当前的进程号是: $/正在执行的进程号echo 上一个进程号是:$!/ 前一个后台的进程号echo 上一个进程号是:$* #全部参数的值echo 上一个进程号是:$# #参数个数case $1 in 1) zipname=jiao.zip jiao; 2) unzipname=jiao.zip -d /export/home/oracle/jiao;esac5.8.3 usage语句它是一个通知用户如何正确激活脚本的简短消息。所有可被多个用户使用的脚本都要包含这样的信息。通常usage语句如下:echo “usage: $0 optionsfiles”.5.8.4 选项和参数命令的参数:在命令行中所有命令名后出现的字符串和单字。选项:改名命令行行为的参数。如:ls l file l file 都是参数, 而l 是选项。 选项实例: USAGE =“Usage:$0 -c | -t file | directory ” case “$1” in -t) TARGS=”-tvf $2” ; -c) TARGS=” cvf $2” ; *)echo “$USAGE” Exit 0 ; Esac如果第一个参数没有给出,脚本应该怎样做?如果用户没有给出第二个参数,脚本应该怎样做?那就需要检查参数个数,检查参数个数最简单的做法就是:if $# -lt 2 then echo “$USAGE” exit 1fi5.8.5 shell脚本的选项分析对传个shell脚本的各种选项的分析有两种方式:a) case 语句手工处理b) getopts 命令getopts 语法:getopts option-string variableoption-string 是包含所有单字符选项的字符串。variable 是被赋值变量的变量名用法:1. getopts查找所有的命令行参数,找到以“_”开头的字符串。2. 如果找到后,与option-string给出的字符串进行比较。3. 找到匹配的话,指定的变量variable设置成选项,否则设置成“?”4. 重复上次的查询。VERBOSE=falseWhile getopts f:o;v OPTIONdo case $option in-f) INFILE=”$option” ;-0) OUTFILE=”$option” ;v)VERBOSE=true ;?) echo “$USAGE” exit 0 ;esac done5.9 输入/输出5.9.1 输出多数命令都会产生输出。比如$ls 当命令产生写向终端的输出时,就称程序将他的输出打印到标准输出或是stdout。 并不是所有的输出都写向终端,出错信息并不是写向终端,而是写向一个特殊类型的输出,该输出为标准错误输出stderr。 Stdout向以下输出信息1. 终端常用命令是:echo , printfEcho 常用于需要简单格式化的字符串打印。可以在echo输出中加入空格,标点符号,变量替换,格式化转义序列(n t c)等。echo “hello”echo hello jiaoecho hello,jiaoecho hello $ORACLE_HOMEprintf 是shell的版本的c语言函数printf为格式化输出提供了高度的灵活性。Printf 和echo 类似,其不同之处是:指定给printf的字符串需要明确的在字符串末尾使用n转义序列才能打印新行,而echo自动换行。Printf的强大之处是格式化输出:Printf format argsFormat: % m.nxX可能值为:S 字符串C 字符D 十进制X 十六进制O 八进制E 指数浮点数F 固定浮点数G 压缩浮点数2. 文件重定向 输出 Ls l logLs l logEcho loh3. 终端和文件Tee命令。比如 ls l | tee test.log5.9.2 输入 将输入重定向到文件,从而从文件中读取输入。输入重定向: commd file Commd delimitercpio idcmv *.cpiocat ttt.txt 11.sh Hhhhh Hhhhh 11.sh 从用户读取输入Shell脚本常用任务之一是:提示用户输入。可以使用read 命令读取,通过case命令计算变量的值。While read lineDo Case $line in *root*) echo $line ; EsacDone file Exec n fileCommod 1 file1 2 file2举例:For file in $FILESDo Ln s $file ./docs file1 2file2Done若将他们重定向到同一个文件,可以Commod file1 2 &15.10 Shell中的函数Shell函数提供了一种将名称和命令清单象映射的方式。Shell函数类似于其他编程语言中的子例程,过程和函数。5.10.1 创建和使用函数 Shell函数定义Name() list;函数由函数名和命令清单list绑定到一起,在定义函数时用到“(”“)”字符。激活一个函数:直接输入 lsl就可以。Lsl() mkdir test函数示例:Lspath() OLDIFS=”$IFS” IFS=: For dir in $PATH Do Echo “$DIR” DoneIFS=$OLDIFS5.11 文本过滤器 下面介绍shell中最常用的文本过滤器命令: Head ,tail,grep, sort, uniq ,tr1) Head语法: head n file除了查看大文件的前几行之外,还有其他的用处比如 Ls l dir | head -5 Ls l ut dir |head -102) Tail语法:tail n fileTail 和head 相似,查看文件的后几行。3) Grep语法: grep word fileGrep “oracle” log还可以从标准输入中读入 Ps ef | grep “oracle”列出行号:Grep n word file-l 更快列出结果。但需要统计一个文件中word 的总数时,wc命令已经不行了,我们需要一下命令:4) Sort5) Uniq6) Tr语法:tr set1 set2Tr set1 set2 file比如:Tr !?”;:?(), file2sed -e 1,10d -e s/yellow/black/g yel.dat函数参数 功能: label 建立 script file 内指令互相参考的位置。# 建立解 集合有相同位址参数的指令。! 不执行函数参数。= 印出资料行数( line number )。a 添加使用者输入的资料。b label 将执行的指令跳至由 : 建立的参考位置。c 以使用者输入的资料取代资料。d 删除资料。D 删除 pattern space 内第一个 newline 字母 前的资料。g 拷贝资料从 hold space。G 添加资料从 hold space 至 pattern space 。h 拷贝资料从 pattern space 至 hold space 。H 添加资料从 pattern space 至 hold space 。l 印出 l 资料中的 nonprinting character 用 ASCII 码。i 插入添加使用者输入的资料行。n 读入下一笔资料。N 添加下一笔资料到 pattern space。p 印出资料。P 印出 pattern space 内第一个 newline 字母 前的资料。q 跳出 sed 编辑。r 读入它档内容。s 替换字串。t label 先执行一替换的编辑指令 , 如果替换成牛p则将编辑指令跳至 : label 处执行。w 写资料到它档内。x 交换 hold space 与 pattern space 内容。y 转换(transform)字元。虽然 , sed 只有上表所述几个拥有基本编辑功能的函数 , 但由指令中位址参数和指令与指令间的配合 , 也能使sed 完成大部份的编辑任务。5.12.2 Awk语法:awk pattern action 变量名 含义ARGC 命令行变元个数ARGV 命令行变元数组FILENAME 当前输入文件名FNR 当前文件中的记录号FS 输入域分隔符,默认为一个空格RS 输入记录分隔符NF 当前记录里域个数NR 到目前为止记录数OFS 输出域分隔符ORS 输出记录分隔符示例:awk /10/ file 显示file中第10行awk print NR,NF,$1,$NF, file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。 域编辑域:被一个或多个域分隔字符分割开的字符集。缺省域分隔符是tab格和空格。如:awk printf $1 $3; fruit_prices.txtawk printf $1 , $3; fruit_prices.txt /打出一个空格 比较操作符在awk中可以使用比较操作符比较字符和数字。=!=Value /pattern/ /value 匹配pattern为真Value!/pattern/如:/bin/ls l |awk $1 ! /total/ printf “ % -32s %sn” , $3,$5 ; Awk新特性主要内容是:变量,流控制,循环.1 变量Name=value什么变量和shell中声明变量一致。1. 使用数字表达式Num1 operator num2示例:For I in $Do If -f $i Then Echo $iAwk / *$/ x=x+1 ; printf x ; $iElseEcho “error:$i not a file” &2Fidone2. 赋值操作符3. 内置变量Filename /但输入文件名时,不应改变该文件的值NR /输入文件中,当前输入行或是记录的编号,不应改变该变量的值NF /当前行或记录中域的编号,不应改变该变量的值OFS FS /输入域分隔符ORS /输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 德佑委托协议书
- 香料精制工职业健康及安全技术规程
- 2026届湖南省邵阳县九年级数学第一学期期末联考试题含解析
- 2026届江苏省常州市武进区数学九上期末质量跟踪监视试题含解析
- 2026届山东省临清市刘垓子镇中学数学七上期末综合测试试题含解析
- 2026届舟山市重点中学数学七上期末检测试题含解析
- 2026届浙江杭州市风帆中学数学九年级第一学期期末学业水平测试模拟试题含解析
- 江苏省镇江市宜城中学2026届数学九上期末监测模拟试题含解析
- 2026届山东省德州市乐陵市数学九上期末复习检测试题含解析
- 基于医院战略的护理人力资源规划与配置研究
- 2025年西藏公开遴选公务员笔试试题及答案(A类)
- 《气候中和园区:工业园区的零碳转型指南》
- 急性重症胰腺炎个案护理
- 拆房协议书模板
- 制造企业物料试用单
- 《斐波那契数列》课件
- 电力排管检验批
- 带式电磁除铁器检修作业指导书
- 生命体征测量操作流程及评分标准
- DB32∕T 3261-2017 水利工程预拌混凝土应用技术规范
- 入团志愿书(2016版本)(可编辑打印标准A4) (1)
评论
0/150
提交评论