您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Linux-基础教程--Shell脚本编程
第10章bash脚本编程本章内容要点Shell脚本的编制、执行和调试Shell脚本的成分和编码规范Shell变量替换扩展、数值计算、输入输出变量分类,位置参数变量和特殊参数变量条件测试(文件测试、字符串测试、整数测试)分支流程控制(if、case)循环流程控制(for、while、until、select)函数的定义和调用、返回值使用循环分析命令行参数本章学习目标熟悉Shell脚本的编码规范,掌握执行和调试方法掌握对变量进行整数运算和间接引用的方法理解位置参数变量和特殊参数变量的用途掌握条件测试的使用[]、[[]]、(())掌握各种流程控制语句的使用if、casefor、while、until、select、break、continue掌握函数的定义、调用和传递返回值的方法掌握命令行参数、位置参数的操作(shift、getopts)SHELL编程基础2020年4月21日4Shell脚本和Shell编程当命令不在命令行中执行,而是从一个文件中执行时,该文件就称为Shell脚本。Shell脚本是纯文本文件。Shell脚本通常以.sh作为后缀名,但不是必须。Shell脚本是以行为单位的,在执行脚本的时候会分解成一行一行依次执行。Shell是一种功能强大的解释型编程语言通常用于完成特定的、较复杂的系统管理任务Shell脚本语言非常擅长处理文本类型的数据2020年4月21日5Shell脚本的成分程序元素保留字、运算符、表达式变量、数组、输入输出控制结构(顺序、分支、循环、子程序调用)Shell功能【参见第2、3章内容】执行命令(内置命令、外部命令、自编程序)重定向、管道、命令替换、命令聚合通配符、注释符、……Shell环境2020年4月21日6Shell脚本的建立与执行Shell脚本的建立使用文本编辑器编辑脚本文件$viscript-file为脚本文件添加可执行权限$chmod+xscript-fileShell脚本的执行在子Shell中执行$bashscript-file$script-file在当前Shell中执行$sourcescript-file$.script-file2020年4月21日7PATH环境变量的默认值不包含当前目录,若脚本文件在当前目录,应使用./script-filePATH环境变量的默认值包含~/bin目录,用户可以将自己的脚本文件存放在~/bin目录,之后即可直接调用脚本文件名执行脚本了Shell脚本的编码规范以#!开头:通知系统用何解释器执行此脚本#!/bin/bash#!/bin/ksh以注释形式说明如下的内容:#脚本名称#脚本功能#作者及联系方式#版本更新记录#版权声明#对算法做简要说明(如果是复杂脚本)2020年4月21日8Shell脚本举例(1)2020年4月21日9#!/bin/bash#ThisisthefirstBashshellprogram#Scriptname:greetings.shechoecho-eHello$LOGNAME,\cechoit'snicetalkingtoyou.echo-nYourpresentworkingdirectoryis:pwd#Showthenameofpresentdirectoryechoecho-eThetimeis`date+%T`!.\nByeechoShell脚本举例(2)2020年4月21日10#!/bin/bash##ScriptName:/etc/cron.daily/ntpdate#使用NTP的客户端命令ntpdate与远程NTP服务器进行同步#也可以用局域网内的NTP服务器替换pool.ntp.org/usr/sbin/ntpdate-spool.ntp.org#更改硬件时钟时都会记录在/etc/adjtime文件中#使hwclock根据先前的记录来估算硬件时钟的偏差,#并用来校正目前的硬件时钟/sbin/hwclock--adjust#将系统时钟同步到硬件时钟/sbin/hwclock–systohc脚本调试方法在bash调用脚本时使用参数$bash[-x][-n][-v]scriptName在脚本中使用bash内置的set命令使整个或部分脚本处于调试模式开启:set[-x][-n][-v]结束:set[+x][+n][+v]2020年4月21日11脚本调试12020年4月21日12sh–x脚本名该选项可以使用户跟踪脚本的执行,此时shell对脚本中每条命令的处理过程为:先执行替换,然后显示,再执行它。shell显示脚本中的行时,会在行首添加一个加号“+”。sh–v脚本名在执行脚本之前,按输入的原样打印脚本中的各行。sh–n脚本名对脚本进行语法检查,但不执行脚本。如果存在语法错误,shell会报错,如果没有错误,则不显示任何内容。脚本调试举例1对脚本进行语法检查$bash-ngreetings.sh显示脚本中每个原始命令行及其执行结果$bash-vgreetings.sh以调试模式执行脚本$bash-xgreetings.sh2020年4月21日13脚本调试2——set命令在脚本内使用set命令开启调试选项set-x:显示由shell执行的命令及其参数set-v:显示由shell读入的命令行set-n:读取命令但不执行他们,用于语法检查在脚本内使用set命令关闭已开启的调试选项set+xset+vset+n2020年4月21日14脚本调试举例2$bashgreetings.sh./greetings.sh$sourcegreetings.sh2020年4月21日15#!/bin/bash#ThisisthefirstBashshellprogram#Scriptname:greetings.shset-x###TurnONdebugmode###echoecho-eHello$LOGNAME,\cechoit'snicetalkingtoyou.echo-nYourpresentworkingdirectoryis:pwd#Showthenameofpresentdirectoryechoset+x###TurnOFFdebugmode###echo-eThetimeis`date+%T`!.\nByeechoShell脚本的类型非交互式脚本不需要读取用户的输入,也不用向用户反馈某些信息每次执行都是可预见的,因为它不读取用户输入,参数是固定的可以在后台执行交互式脚本脚本可以读取用户的输入,实时向用户反馈信息(输出某些信息)这样的脚本更灵活,每次执行时的参数可由用户动态设定用户界面更友好,但不适用于自动化任务(如cron任务)2020年4月21日16学习Shell编程的前提掌握一种文本编辑器的使用(Vi)熟悉Linux文件系统的布局学习Shell的各种功能重定向、管道、命令替换、命令聚合学习各种管理和监视命令的使用用户管理、权限管理、进程管理、包管理……系统监视、网络监视……学习各种文本文件工具的使用cat、grep、tr、sed、awk……正则表达式2020年4月21日17系统的配置文件几乎都是纯文本文件变量和表达式2020年4月21日18Shell变量操作变量替换扩展变量测试变量的字符串操作变量的间接引用变量的数值计算$[expression]$((expression))exprletdeclare-i2020年4月21日19输入变量赋值name=valuereadonly从标准输入读取read输出echoprintf变量替换扩展——变量测试2020年4月21日20UseDefaultValues${var:-word}若var存在且非空,则值为$var;若var未定义或为空值,则值为word,但var的值不变。AssignDefaultValues${var:=word}若var存在且非空,则值为$var;若var未定义或为空值,则值为word,且var被赋值word。DisplayErrorifNullorUnset${var:?word}若var存在且非空,则值为$var;若var未定义或为空值,则输出信息word,并终止脚本。UseAlternateValue${var:+word}若var存在且非空,则值为word;否则返回空值,但var的值不变。变量测试举例2020年4月21日21color=bluenewcolor=${color:-grey}unsetcolorechoTheskyis${color:-grey}todayecho$colorechoTheskyis${color:=grey}todayecho$colorechoTheskyis${color:?error}todayecho$colorechoTheskyis${color:+blue}todayecho$color变量替换扩展——字符串计数、截取2020年4月21日22${#var}返回字符串变量var的长度${var:m}返回${var}中从第m个字符到最后的部分${var:m:len}返回${var}中从第m个字符开始,长度为len的部分${var#pattern}删除${var}中开头部分与pattern匹配的最小部分${var##pattern}删除${var}中开头部分与pattern匹配的最大部分${var%pattern}删除${var}中结尾部分与pattern匹配的最小部分${var%%pattern}删除${var}中结尾部分与pattern匹配的最大部分m的取值从0到${#var}-1注:pattern中可以使用通配符。字符串变量替换扩展举例12020年4月21日23str='Ilovelinux.IloveUNIXtoo.’echo${#str}30echo${#str:13}IloveUNIXtoo.echo${#str:7:5}linuxecho${str#Ilove}linux.IloveUNIXtoo.echo${str#I*.}IloveUNIXtoo.echo${str##I*}变量替换扩展——字符串替换2020年4月21日24${var/old/new}用new替换${var}中第一次出现的old${var//old/new}用new替换${var}中所有的old(全局替换)${var/#old/new}用new替换${var}中开头部分与old匹配的部分${var/%old/new}用new替换${var}中结尾部分与old匹配的部分注:(1)old中可以使用通配符。(2)var可以是@或*,表示对每个位置参数进行替换字符串变量替换扩展举例22020年4月21日25str='Ilovelinux.IloveUNIXtoo.’echo${str/love/like}Ilikelinux.IloveUNIXtoo.echo${str//love/like}Ilikelinux.IlikeUNIXtoo.echo${str/I*linux/IlikeFreeBSD}IlikeFreeBSD.IloveUNIXtoo.echo${str/#Ilove/J'aime}J'aimelinux.IloveUNIXtoo.echo${str//Ilove/J'aime}J'aimelinux.J'aimeUNIXtoo.echo${str/%too./also.}Ilovelinux.IloveUNIXalso.字符串变量替换扩展举例32020年4月21日26set1v11v21v31v4echo$@1v11v21v31v4echo${@/1/a}av1av2av3av4echo${@//1/a}avaav2av3av4echo${@/%1/a}1va1v21v31v4变量的间接引用通过str2的值来引用str1
本文标题:Linux-基础教程--Shell脚本编程
链接地址:https://www.777doc.com/doc-4928895 .html