UnixShell编程基础培训(基础篇).ppt

上传人:sh****n 文档编号:6436254 上传时间:2020-02-25 格式:PPT 页数:146 大小:1.73MB
返回 下载 相关 举报
UnixShell编程基础培训(基础篇).ppt_第1页
第1页 / 共146页
UnixShell编程基础培训(基础篇).ppt_第2页
第2页 / 共146页
UnixShell编程基础培训(基础篇).ppt_第3页
第3页 / 共146页
点击查看更多>>
资源描述
UnixShell编程基础篇 北京神州数码思特奇信息技术股份有限公司研究院 课程目标 熟练编写UnixShell程序 内容提纲 Shell介绍Shell脚本介绍Shell特性正则表达式变量与运算符Shell的输入与输出Shell函数脚本调试高级编程技巧Shell工具 SHELL介绍 Shell UNIX命令解释器 问题引入 DOS系统的命令由command负责执行 并且对重覆性或多个命令运行可写成批处理文件 只要执行这个批处理文件就等於执行这些命令 UNIX系统如何处理 Shell shell是一种命令语言 同时又是一种程序设计语言 UNIX系统利用shell命令解释器 command languageinterpreter 完成用户输入命令的执行 是用户与系统交互的界面 是命令与kernel之间的接口 shell接收用户输入的命令 对命令作出解释 然后发送给kernel执行之 shell是一个解释型的程序设计语言 shell程序 脚本 相当于dos的批处理文件 可简单到只有一条命令 也可以包括循环 条件语句 数学运算 控制结构的程序 完成复杂的管理任务 Shell UNIX命令解释器 SHELL脚本介绍 Shell脚本介绍 为什么使用Shell脚本 批量命令重复 条件等控制Shell脚本的基本内容 bin sh第一行注释 第二行变量第三行条件判断 循环第四行脚本的运行方式chmod x脚本 脚本文件名 Shell脚本介绍 示例 hello sh bin bash 这是一个基本的shell脚本op helloworld echo op SHELL特性 Shell特性 别名命令替换管道重定向后台处理模式匹配变量特殊字符 别名 aliasEg aliasll ls alh 命令替换 myfile的内容如下 marmfindfile实现替换如下 ls catmyfile al 后台处理 什么是后台 一个终端可以同时运行多个程序用法 nohupcommand 可以再后台运行此命令示例 nohubtar czf要压缩的文件名压缩后的文件名 查看后台命令使用 jobs l 变量 示例 bin bash 这是一个基本的shell脚本printchar helloworld echo printchar变量用来存储信息 管道 把一个命令的输出连接到另一个命令的输入 示例 ls sortcatfunc txt grep v 重定向 与管道相关 可以改变程序运行的输入来源和输出地点示例 sortmyfile test txt 模式匹配 显示以txt为扩展名的文件或显示以a开头的文件 这种情况称为模式匹配 实现方式 正则表达式如 ls txt 特殊字符 分号 允许在一行上放多个命令 eg cd backup mkdirstartup cp startup doecho xx x 1 doneexit0 特殊字符 两个星号在运算时代表 次方 的意思eg sus 2 3 echo sus sus sus 8 大括号 用法一 通配符扩展eg lsmy finger toe s这条命令相当于如下命令的组合 lsmy fingersmy toeseg mkdir userA userB userC home bin data 用法二 可用于语句块的构造 string 单引号和 string 双引号双引号 如果想在定义的变量中加入空格 就必须使用单引号或双引号 单 双引号的区别在于双引号转义特殊字符而单引号不转义特殊字符eg heyyou home echo heyyou heyyou 没有转义 eg heyyou home echo heyyou home 转义了输出了heyyou变量的值 特殊字符 单引号 由单引号括起来的字符都作为普通字符出现 特殊字符用单引号括起来以后 也会失去原有意义 而只作为普通字符解释 例如 单引号 由双引号括起来的字符 除 和 这几个字符仍是特殊字符并保留其特殊功能外 其余字符仍作为普通字符对待 root localhost String PATH PATH root localhost echo String usr kerberos sbin usr kerberos bin usr local sbin usr local bin sbin bin usr sbin usr bin usr X11R6 bin root bin PATH 特殊字符 双引号 用来使shell无法认出空格 制表符和其他大多数特殊字符 这样 DavidMedinets 表示一个值 让 反斜杠反引号不失效单引号 用来使shell无法认出所有特殊字符 反引号 用来替换命令 反斜杠 用来使shell无法认出以上的特殊字符 使其后的特殊字符失去特殊含义 如 David Medinets root sky root touchDavid Medinets root sky root lsDavid medinets放在指令前 有取消aliases 别名 的作用 放在特殊符号前 则该特殊符号的作用消失 放在指令的最末端 表示指令连接下一行 使得回车符无效 只起换行作用 正则表达式 模式匹配 正则表达式 正则表达式在shell 工具程序 Perl语言中有非常重要的地位 正则表达式通过一些特殊符号表示特定的字符串模式 常见的特殊字符包括 字符功能 置于待搜索的字符串之前 匹配行首的字 置于待搜索的字符串之后 匹配行末的字 匹配一个字的字尾 匹配任意单个正文字符 str 匹配字符串str中的任意单个字符 str 匹配不在字符串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作为单项处理 基本元字符集 模式匹配 正则表达式 匹配行首 行尾 行首 行尾 举例查找当前目录下面所有子目录ls l grep d 查找文本文件中 以a开头的行morea txt grep a 查找文本文件中 以a结尾的行morea txt grep a 查找文本文件中 所有的空行morea txt grep 模式匹配 正则表达式 匹配单个字符 模式 举例 abc 可以匹配12abc34 ababc43等 模式匹配 正则表达式 匹配0或多个字符 模式 举例abc12 可以匹配如下abc123abc14248876abc11abc 模式匹配 正则表达式 匹配单词 模式 功能 匹配完整的单词举例 模式匹配 正则表达式 屏蔽特殊字符 功能 将字符串中的特殊字符去掉特殊意义特殊字符 举例匹配包含 字符的行 匹配包含 的行 匹配包含 的行 模式匹配 正则表达式 匹配范围 功能 匹配特定的字符串或字符串集举例 0123456789 或 0 9 匹配任意数字 A Za z 匹配任意字母a a zA Z t a开始 任意字母 t hH ello 匹配Hello或者hello 0 9 匹配任一个非数字字符 a zA Z 匹配任一个非字母字符 模式匹配 正则表达式 匹配模式结果出现次数 pattern n 匹配模式出现n次 pattern n 匹配模式出现最少n次 pattern n m 匹配模式出现n到m次之间 n m为0 255中任意整数 模式匹配 正则表达式 举例 A 2 BAABA 4 BAAAAB AAAAAB AAAAAAB A 2 4 BAAB AAAB AAAAB 模式匹配 正则表达式 练习 从如下文本中 选出日期格式符合yyyy mm dd的行2006 05 1713910591921chenyq2006071113301131125suwn2006 07 1913123451231aaa2005 11 2513611258734bbb过滤模式 0 9 4 0 9 2 0 9 2 模式匹配 正则表达式 变量与表达式 变量与运算符 本地变量环境变量变量替换位置变量标准变量特殊变量 影响变量的命令引号运算符表达式替换运算符优先级 变量 什么是shell变量本地变量环境变量变量替换位置变量标准变量特殊变量影响变量的命令 本地变量 本地变量在用户现在的shell生命期的脚本中存在使用 variable name value设置变量及值set显示本地所有的变量readonlyvariable name变量只读设置后不能在设置回来了 本地变量 续 root jack root LOCALTEST test root jack root echo LOCALTEST Test root jack root readonlyLOCALTEST root jack root LOCALTEST test1 Bash LOCALTEST readonlyvariable root jack root readonly p 查看当前设置的本地变量Declare rLOCALTEST test Declare irUID 0 示例 环境变量 用于所有用户进程 称为子进程 登录进程称为父进程 Shell中执行的用户进程均称为子进程 不像本地变量 只用于当前的shell 环境变量可用于所有子进程 包括编辑器 脚本和各种应用程序 HOME bash profile etc profile export用于显示与设置环境变量env查看环境变量eg exportSITECH BeiJing readonlySITECH设置只读 环境变量 如果使用了readonly命令的话 变量就不可以被修改或清除了 示例如下 exportTEST Test 增加一个环境变量TEST readonlyTEST 将环境变量TEST设为只读 unsetTEST 会发现此变量不能被删除 bash unset TEST cannotunset readonlyvariable TEST New 会发现此也变量不能被修改 bash TEST readonlyvariable set env export区别 set显示当前shell的变量 包括当前用户的变量env显示当前用户的变量export显示当前导出成用户变量的shell变量每个shell有自己特有的变量 set 显示的变量 这个和用户变量是不同的 当前用户变量和你用什么shell无关 不管你用什么shell都在 比如HOME SHELL等这些变量 但shell自己的变量不同 shell是不同的 比如BASH ARGC BASH等 这些变量只有set才会显示 是bash特有的 export不加参数的时候 显示哪些变量被导出成了用户变量 因为一个shell自己的变量可以通过export 导出 变成一个用户变量 root linux aaa bbb root linux echo aaabbb root linux set grepaaaaaa bbb root linux env grepaaa root linux exportaaa root linux env grepaaaaaa bbb 环境变量 用C程序来访问和设置环境变量使用下列三个函数来设置或访问一个环境变量 getenv 访问一个环境变量 输入参数是需要访问的变量名字 返回值是一个字符串 如果所访问的环境变量不存在 则会返回NULL setenv 在程序里面设置某个环境变量的函数 unsetenv 清除某个特定的环境变量的函数 有一个指针变量environ 它指向的是包含所有的环境变量的一个列表 下面的程序可以打印出当前运行环境里面的所有环境变量 includeexternchar environ intmain char var for var environ var NULL var printf s n var return0 还可以通过修改一些相关的环境定义文件来修改环境变量 比如对于RedHat等Linux发行版本 与环境相关的文件有 etc profile和 bashrc等 修改完毕后重新登录一次就生效了 变量替换 续 1 echo variablename 显示实际值到variablename中2 echo variablename value 如果设置了variablename 则显示其值value 否则显示为空 3 echo variablename value 如果未设置variablename 则显示用户自定义的错误信息value 4 echo variablename value 如果未设置variablename 则显示其值value 否则显示原来值 5 echo variablename value 如果未设置variablename 设置其值为value 并显示 变量替换 续 unset 删除环境变量unsetvariable name例如 root jack root testvar thisisatest root jack root echo testvar Thisisatest root jack root unsettestvar root jack root echo testvar root jack root 如果是readonly的变量是不能进行取消删除的 位置变量 位置变量表示形式 0 1 2 9向脚本中使用位置参数向系统命令传递参数 1 2 3 10 11 12 表示脚本传入的的各个参数 注意当需表示两位数以后的参数时数字要用花括号括起 标准变量 bash默认建立了一些标准环境变量 可在 etc profile中定义 EXINITHOMEecho HOME IFSLOGNAMEecho LOGNAME获取当前登录名set grep LOG 与之功能等价MAILset grep MAIL MAIL usr spool mail account存放邮箱位置MAILCHECK 600每隔600秒扫描邮箱一次MAILMSG YOUHAVENEWMAIL 邮箱信息MAILCHECK 标准变量 MAILPATHPATHeg set grep PATH 取得环境路径PS1eg set grep PS 改变命令提示符信息PS2SHELLeg set grep SHELL 取得当前SHELL信息TERMINFOeg set grep TERMINFO TERMeg set grep TERM 显示终端类型TZeg set grep TZ 表示时区EDITORPWDeg set grep PWD 取得当前目录信息MANPATHeg set grep MANPATH 特殊变量 传递到脚本的参数个数 以一个单字符串显示所有向脚本传递的参数 与位置变量不同 此选项参数可超过9个 脚本运行的当前进程ID号 后台运行的最后一个进程的进程ID 与 相同 但是使用时加上引号 并在引号中返回每个参数 显示shell使用的当前选项 与set命令功能相同 显示最后命令的退出状态 0表示没有错误 其它任何值表示有错误 影响变量的命令 readonly用于显示或设置只读变量 表明选项结束 f创建只读变量set设置或重设各种shell 影响变量的命令 unset用于取消变量的定义 表明选项结束 f删除只读变量 但不能取消从shell环境中删除指定的变量和函数 如 PATH PS1 PS2 PPID UID EUID等的设置 运算符 运算符类型 位运算符 表示对方括号中的表达式进行求值 2 4 例如 bin bash 表示举例echo 2 8 运算符 位运算符 运算符 运算符类型逻辑运算符赋值运算符 eg var 65letvar 4echo var 69 表达式替换 和 习惯使用 所有shell的求值都是用整数完成 可以接受不同基数的数字 base n n表示基数从2到36的任何基数 eg 八进制的10加1 结果为9echo 10 8 1 9 运算符优先级 小结 本地变量环境变量变量替换位置变量标准变量特殊变量 影响变量的命令引号运算符表达式替换运算符优先级 SHELL输入 输出 echoreadcat管道tee文件重定向 Shell输入 输出控制 echo显示文本或变量 或者把字符串输入到文件命令格式echostring e表示解析转义字符 n回车不换行 linux默认回车换行控制字符 c 不换行 t 跳格 n 换行举例echo What syour nname c readnameecho LOGNAME echo 示例 echo举例 bin bash echodecho e Thisecho s3newlines n n n n echo OK echoecho Thisecho s3newlines n n n n echo Thelogfileshaveallbeendone mylogfile txt read从键盘或文件的某一行文本中读入信息 并将其赋给一个变量命令格式read变量1变量2 举例 readname1name2tomjerrybob read 示例 bin bash readnameecho n FirstName readfirstnameecho n LastName readlastnameecho e YourFirstNameis firstname n echo e YourLastNameis lastname n read举例 文件重定向 标准输出 输入及错误 在shell中执行命令时 每个进程都和三个打开的文件相关联 并使用文件描述符来引用这些文件 由于文件描述符不容易记忆 shell同时也给出了相应的文件名 文件重定向 改变程序运行的输入来源和输出地点 文件重定向 改变程序运行的输入来源和输出地点 例1 将myfle1作为sort的输入 sort myflle1例2 将date的输出转向到myfile2文件中 date myfile2例3 将Is l的输出追加到myfile3文件中 Is l myfile3例4 将myprogram错误输出改向到err file文件 myprogram2 err file 文件重定向举例 重定向标准输出示例catfile sort1 sort out第3种情况catfile sort sort out第1种情况pwd path out第2种情况 nullfile txt创建一个文件重定向标准输入示例sortname out第8种情况对排序后的内容输出到name out文件中 文件重定向举例 标准输入示例 第9种情况 root jackshell cat term txtHello thereIamusinga TERM andmyusernameis LOGNAME bye SITECH root jackshell catterm txtHello thereIamusingavt100 andmyusernameisrootbye 文件重定向举例 重定向标准错误示例 root jackshell grep trd book txtGrep missiles Nosuchfileordirectory root jackshell grep trd book txt2 dev null解释 表示把错误信息扔给 dev null dev null不会保存错误信息 实质就是丢失错误信息 如果sky txt不存在 则错误信息存入到一个指定的文件中 如 ls alsky txt2 err message txt 文件重定向举例 结合使用标准输出与标准错误示例 root jackshell cataccount new txt Account old txt1 accounts out2 accounts err root jackshell cataccounts out root jackshell cataccounts err 文件重定向举例 将2个文件的内容重定向到accounts out中 如果某一个文件不存在 或出错 则将错误信息重定向到错误文件中accounts err 合并标准输出与标准错误示例 合并的时候shell是从左到右分析相应命令grep standard standard txt grep out2 1 如果文件不存在 则把错误信息记录到grep out中 如果文件存在 也把正确的信息记录到grep out中 文件重定向举例 重定向标准输出ls l ls outls l ls out重定向标准输入sort dev null组合重定向find name log find log2 1 练习 echoreadcat管道重点掌握tee文件重定向重点掌握 小结 SHELL控制结构 条件测试 shell的内部命令里面有测试条件的语法test给ifwhile用testcondition或者 condition 条件测试 文件状态测试逻辑操作符字符串测试数值测试expr 文件状态测试 格式 test状态或 状态 举例test wstudent txtecho xstudent txt echo efile 文件存在 d etc 目录存在 sfile 文件大小大于0 rfile 文件可读 bfile 区块文件 cfile 字符文件 ffile 一般文件 wfile 文件可写 xfile 文件可执行 kfile 设定了限定位 gfile 设定了组位 ufile 设定了userid pfile 管线 ofile 如果当前用户拥有filename 则为真 字符串测试 命令格式 操作符字符串 字符串操作符字符串 举例 z EDITOR EDITOR vi 数值测试 命令格式 数字1 操作符 数字2 数字1 操作符 数字2 举例 100 lt 110 echo NUMBER 100 NUMBER ge110 echo 900 le 901 a 100 gt 99 echo 逻辑操作符 逻辑操作符 a逻辑与 o逻辑或 逻辑否举例 xstudent a wstudent echo expr 命令格式expr参数操作符参数增量计数LOOP 0LOOP expr LOOP 1 数值测试模式匹配 条件测试 小结 文件状态测试逻辑操作符字符串测试数值测试expr 控制流结构 流控制ifthenelse 条件测试case 匹配模式 单词或值循环for循环until循环while循环 ifthenelse语句 语法格式 if条件1then命令1elif条件2then命令2else命令3fi示例 if 10 lt 11 thenecho 10islessthan11 fi ifthenelse语句 bin sh ifsamples2echo n Enteryourname readNAMEif NAME z NAME thenecho sorry youdidnotenteraname elseecho youentered NAME fi 示例 bin sh ifcpifcpmyfile bakmyfile thenecho goodcopy elseecho basename 0 errorcouldnotcopythefiles 2fi ifthenelse语句 bin sh ifelifecho n Enteryourname readNAMEif NAME z NAME thenecho Youdidnotenteraname elif NAME root echo Helloroot elif NAME jack echo Hellojack elseecho youarenotorjack buthi NAME fi 示例 case语句 语法格式 case值in模式1 命令1 模式2 命令2 esac 模式匹配 表示任意字符 表示任意单个字符 abc a b或c三字符其中之一 a n 从a到n的任一字符 多重选择 case语句 bin sh casetest1echo n enteranumberbetween1and3pls readNUMcaseNUMin1 echo youentered1 2 echo youentered2 3 echo youentered3 Y y echo youentered NUM echo basename 0 exit1 esac 示例 for循环 语法格式 for变量名in列表do命令1命令2 done for循环 bin sh fortest1forloopin12345doecho loopdone 示例 bin sh fortest2forloopin isthisyourpen doecho loopdone 列表换为 isthisyourpen 或 catmyfile for循环 bin sh fortest3BAK bak forloopin ls doecho backup loopto loop BAK cp loop loop BAKdone 示例 for循环 bin sh fortest4counter 0forfilesin docounter expr counter 1 doneecho Thereare counterfilesin pwd 示例 for循环 将 foo后缀的文件批量改名为 bar后缀 forfin foo dobase basename f foo mv f base bardone 示例 将大写文件名改为小写文件名 forfin domv f echo f tr A Z a z done until循环 语法until条件命令1命令2 done示例 bin sh untiltest2counter 0echo counteruntil counter ge 100 docounter expr counter 1 echo counterdone 条件发生在循环末尾 至少执行一次循环 until循环 示例 bin sh until monpart backup 得到磁盘使用的百分比LOOK OUT df grep part awk print 5 sed s g echo LOOK OUTuntil LOOK OUT gt 90 doecho 文件备份已经快满了 mailrootLOOK OUT df grep part awk print 5 sed s g sleep3600done nohup 文件名 sh后台运行 程序休息3600秒 while循环 语法格式 while条件do命令1命令2 done while循环 bin sh whiletest1counter 0echo counterwhile counter lt 100 docounter expr counter 1 echo counterdone 示例1 while循环 bin sh whiletest2whilereadLINEdoecho LINEdone a sh 示例2 表示从a sh文件中一行行读出数据到LINE中 循环输出 while循环 yymm 200810no 10low 0con db dbaccopr accoprdb152 ACCDBtab name all owedet tmpsrc dcustowesqlplus s con db droptable tab name createtable tab name while no lt100 doif no lt10 thensqlplus s con db insertinto tab name select字段 from src yymm low no commit elif no lt100 theninsertinto tab name selectcontract no id no fee code detail code cust id payed status should payshould favour feefavour payed prepayfrom src yymm no fino expr no 1 doneexit 示例3 while循环 yymm 200810num 10low 0con db dbaccopr accoprdb152 ACCDBtab name all owedet tmpsrc dcustowesqlplus s con db while num lt100 doecho num insertinto tab name selectcontract no id no fee code detail code cust id payed status should payshould favour feefavour payed prepayfrom src yymm num commit num expr num 1 doneexit 示例4 循环控制 break跳出循环continue不会跳出循环 跳过本次循环 进入下一次循环 循环控制举例 示例 bin sh breakoutwhile doecho n Enteranynumber 1 5 readANScase ANSin1 2 3 4 5 echo 您键入正确的数字 echo 错误的输入 break esacdone 表示永远为真 循环控制举例 示例 bin sh breakoutwhile doecho n Enteranynumber 1 5 readANScase ANSin1 2 3 4 5 echo 您键入正确的数字 echo 错误的输入 是否继续 y n readIS CONTINUEcase IS CONTINUEiny yes Y YES continue break esacesacdone SHELL实例 设计一个Shell程序 在 userdata目录下建立50个目录 即user1 user50 并设置每个目录的权限 其中其他用户的权限为 读 文件所有者的权限为 读 写 执行 文件所有者所在组的权限为 读 执行 考答案 建立程序如下 bin shi 1while i le50 doif d userdata thenmkdir p userdata user ichmod754 userdata user iecho user i let i i 1 或i i 1 elsemkdir userdatamkdir p userdata user ichmod754 userdata user iecho user i let i i 1 或i i 1 fidone 练习 编写一个菜单界面1 显示当前目录下所有文件2 显示当前目录下所有文件大小3 使用vi编辑器4 查看当前系统中登陆的用户q 退出菜单 控制流结构 小结 流控制ifthenelse 条件测试case 匹配模式 单词或值循环for循环until循环while循环循环控制breakcontinue SHELL函数 shell函数 函数定义参数传递函数文件检查载入和删除函数函数的返回 函数定义 情况一 函数名 命令1命令2 情况二 function函数名 命令1命令2 函数定义 bin sh funcfunctionhello echo 你好 今天是 date echo helloecho 示例1 函数定义 bin shdisksum echo ls l awk d total 5 END print Totalsizeis total disksum 示例2 函数定义 bin shdisksum echo ls l awk d total 5 END print Totalsizeis total disksum 示例 参数传递 bin sh funcfunctionhelo echo 你好 1今天是 date echo hellojackecho 示例 向函数传递参数就是在脚本中使用位置变量 1 2 3 9 函数文件 将常用函数整理 放在函数文件中 并载入shell创建函数文件 bin sh定位文件 函数名检查载入函数set执行shell函数函数名删除shell函数unset函数名 函数文件举例 示例 bin sh func hellofunecho helloecho bin sh hellofunfunctionhelo echo 你好 1今天是 date return1 检查载入函数和删除函数 查看载入函数Set删除函数unset 检查载入函数和删除函数举例 示例 bin sh func hellofunset表示显示载入状态unsethello表示删除hello函数调用echo helloecho bin sh hellofunfunctionhelo echo 你好 1今天是 date return1 函数的返回 return返回状态值不能当成变量的返回对待 使用return返回脚本中函数调用的下一语句return 用最后状态命令决定返回值return0 无错误返回return1 有错误返回 函数的返回举例 示例 bin sh hellofunctionfunctionhelo echo 你好 1今天是 date return0 bin sh func hellofunctionsetecho helloecho echo 取得调用函数返回的状态值 shell函数 小结 函数定义参数传递函数文件检查载入和删除函数函数的返回 目的 将文本的ShellScript文件设为可执行的ShellScript对任何操作系统而言 文本文件不具备直接执行的功能 Dos系统通过赋予批处理文件 bat 的类型 使之执行 UNIX系统采用将ShellScript文件权限设定成可执行 或利用shell的内建机制 使ShellScript文件具备执行的功能必要条件 将shellscript文件权限设为可执行chmodu xfilename只有用户自己可执行 其它人不能执行chmodug xfilename仅用户及同组人可执行 其它人不能执行chmoda xfilename所有人都可以执行 shell文本程序的可执行化 运行 最简单的调试命令当然是使用echo命令 您可以使用echo在任何怀疑出错的地方打印任何变量值 这也是绝大多数的shell程序员要花费80 的时间来调试程序的原因 Shell程序的好处在于不需要重新编译 插入一个echo命令也不需要多少时间 shell也有一个真实的调试模式 如果在脚本 strangescript 中有错误 您可以这样来进行调试 这将执行该脚本并显示所有变量的值 shell还有一个不需要执行脚本只是检查语法的模式 可以这样使用 这将返回所有语法错误 调试脚本 调试脚本 一般错误 循环错误for while until和case语句中的错误是指实际语句段不正确 也许漏写了固定结构中的一个保留字 下面错误打印信息done 这是一个很好的线索 因为这时知道正在处理一个while语句 回溯脚本段 检查while语句 是否漏写或错写了关键字 如d或者正在使用的条件语句 调试脚本 一般错误 典型的漏写引号第二个典型错误是漏写引号错误 经常要注意这个问题 因为此错误经常出现 这里给出解决这类错误的唯一方案是在脚本中确保所有引号成对出现 当shell打印出错误行后 通常在vi编辑器中查看文件 使用vi的setnu选项调试错误 先进入vi 然后点击键 后跟一冒号 再键入setnu 这时给出文本行号 然后进入shell打印错误行 调试脚本 一般错误 测试错误另一个常见错误是在使用 eq语句时忘记在测试条件一边使用数字取值 如果得到下列错误提示 通常是由于两件事情 需要在变量和方括号间加空格 在方括号里漏写操作符 missing 调试脚本 一般错误 字符大小写经验上讲大多数错误是由于使用变量时大小写保持不一致 例如经常在开始定义时用大写 然后在变量调用时用了小写字符 这样难免变量会没有赋值 调试脚本 一般错误 for循环使用for循环时 有时会忘了在循环的列表部分用 符号 特别是在读取字符串时 调试脚本 一般错误 echo最有用的调试脚本工具是echo命令 一般在可能出现问题的脚本重要部分加入echo命令 例如在变量读取或修改操作其前后加入echo命令 使用最后状态命令判断命令是否成功 这里需要注意的是 不要使用echo命令后直接加最后状态命令 因为此命令永远为真 set命令 set命令可辅助脚本调试 以下是set命令常用的调试选项 set n读命令但并不执行 set v显示读取的所有行 set x显示所有命令及其参数 将set选项关闭 只需用 替代 有人总认为 应该为开 而 应为关闭 但实际刚好相反 可以在脚本开始时将set选项打开 然后在结束时关闭它 或在认为有问题的特殊语句段前后打开及关闭它 调试示例演示 以下脚本将名字保存在变量列表中 用户输入名字 for循环循环变量列表查看是否有匹配模式 注意这里在脚本开始时使用了set x 并在结尾部分关闭它 调试示例演示 运行此脚本 给出一个不在列表中的名字 输出如下 输出显示对变量列表进行循环时所有的比较操作 当读取文件或进行字符串或取值的比较发现问题时 使用set命令是很有必要的 总结 跟踪错误的最好方式是亲自查阅脚本 并使用et命令并加大量的echo语句 高级编程技巧 快速创建一个文件自动ftp传输访问数据库 快速创建一个文件 快速创建一个文件 并向其中存入一些文本 cat myfile myfile NEWFILE 自动ftp传输 问题 服务器资源下载演示 下面的脚本将会提示如下的信息 1 希望登录的远程主机 2 文件传输的类型是二进制方式还是ASCII方式 3 要下载的文件名 4 存放下载文件的本地目录 实现脚本如下 访问数据库 shell脚本一个常用的用途就是访问数据库系统获得信息 实现这样的功能 是再理想不过了 可以用它来输入你在面对数据库提示时所做的各种选择 下面的例子介绍如何使用 来连接其他应用程序 完成相应的任务 SHELL脚本案例分析 示例一 示例 项目实例 项目案例一 财务账务项目程序片段分析 项目案例二 电信特服与月租费用程序片段分析 小结 作为一个系统管理员必须了解和掌握shell的技术 包括 shell基本概念和功能shell变量shell命令shell语言控制结构shell的编程技术 UNIX系统的管理配置文件都是利用shell语言编写的 通过shell程序实现对系统的集成 维护 控制 优化和管理 shell技术在UNIX系统中发挥着巨大的作用
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!