《Linux操作系统》课件-10.Linux进程管理_第1页
《Linux操作系统》课件-10.Linux进程管理_第2页
《Linux操作系统》课件-10.Linux进程管理_第3页
《Linux操作系统》课件-10.Linux进程管理_第4页
《Linux操作系统》课件-10.Linux进程管理_第5页
已阅读5页,还剩289页未读 继续免费阅读

下载本文档

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

文档简介

1.进程管理01进程概述02进程管理03作业控制本章内容要点01理解进程相关概念02掌握如何运行后台进程及注销后继续执行03掌握进程管理命令的使用本章学习目标04掌握作业控制的命令及快捷键的使用程序、进程和作业程序(program)程序是机器指令的集合,文件形式存储进程(process)进程是一个程序在其自身的虚拟地址空间中的一次执行活动程序、进程和作业作业/任务(job/task)用户通过操作系统用户接口(Shell或X环境)提交给计算机进行加工处理的程序。如用户发出一个打印命令,就产生一个打印作业/任务进程和程序概念的比较程序进程一个静态的指令集合。是一个程序的动态执行过程,它具有生命期,是动态的产生和消亡的。进程和程序概念的比较进程资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源。程序不能申请系统资源、不能被系统调度、也不能作为独立运行的单位,因此,它不占用系统的运行资源。进程和程序概念的比较进程一方面一个程序可以由多个进程所共用,即一个程序在运行过程中可以产生多个进程。程序另一方面,一个进程在生命期内可以顺序的执行若干个程序。程序和进程无一一对应的关系进程进程是一个动态实体进程是处理器通过操作系统调度的基本单位每个进程的执行都独立于系统中的其它进程进程之间可以通过称为进程间通信(IPC)的机制进行交互当进程之间共享数据时,操作系统使用了同步技术来保证共享的合法性Linux是多用户多任务系统当多个用户同时在一个系统上工作时,Linux要能够同时满足用户们的要求,而且还要使用户感觉不到系统在同时为多个用户服务,就好像每一个用户都单独拥有整个系统一样。每个用户均可同时运行多个程序。为了区分每一个运行的程序,Linux给每个进程都做了标识,称为进程号(processID),每个进程的进程号是唯一的。Linux是多用户多任务系统Linux给每个进程都打上了运行者的标志,用户可以控制自己的进程:给自己的进程分配不同的优先级,也可以随时终止自己的进程。进程从执行它的用户处继承UID、GID,从而决定对文件系统的存取和访问。Linux的多任务实现——分时技术Linux不可能在一个CPU上同时处理多个任务(作业)请求,而是采用“分时”技术来处理这些任务请求分时技术所有的任务请求被排除一个队列,系统按顺序每次从这个队列中抽取一个任务来执行,这个任务执行很短的时间(几毫秒)后,系统就将它排到任务队列的末尾,然后读入队列中的下一个任务,以同样的方式执行。这样经过一段时间后,任务队列中的所有任务都被执行一次,然后又开始下一轮循环。Linux中的进程识别使用PID区分不同的进程系统启动后的第一个进程是init,它的PID是1init是唯一一个由系统内核直接运行的进程除了init之外,每个进程都有父进程(PPID标识)Linux中的进程识别每个进程还有四个与用户和组相关的识别号实际用户识别号

(realuserID,RUID)实际组识别号

(realgroupID,RGID)有效用户识别号

(effectuserID,EUID)有效组识别号

(effectgroupID,EGID)用户、进程与权限RUID和RGID的作用识别正在运行此进程的用户和组一个进程的RUID和RGID就是运行此进程的UID和GIDEUID和EGID的作用确定一个进程对其访问的文件的权限除了产生进程的程序被设置SUID和SGID权限位之外,一般EUID、EGID和RUID、RGID相同若程序被设置了SUID或SGID权限位,则此进程相应的EUID和EGID,将和运行此进程的文件的所属用户的UID或所属组的GID相同进程类型交互进程由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行批处理进程不与特定的终端相关联,提交到等待队列种顺序执行的进程守护进程(Daemon)在Linux在启动时初始化,需要时运行于后台的进程进程的启动方式手工方式:使用操作系统提供的用户接口前台后台(&)调度方式:按照预先指定的时间执行atbatchcron前台与后台前台进程指一个程序控制着标准输入/输出,在程序运行时,shell被暂时挂起,直到该程序运行结束后,才退回到shell。在这个过程中,用户不能再执行其它程序。后台进程用户不必等待程序运行结束就可以执行其它程序。运行后台进程的方法是在命令行最后加上“&”例如:$sleep10000&查看系统中的进程使用ps命令查看进程状态信息显示哪些进程正在执行和执行的状态进程是否结束、进程有没有僵死哪些进程占用了过多的系统资源等ps(ProcessStatus)命令格式ps[选项]不带任何选项的ps命令显示当前用户所在终端中的所有进程输出项包括:识别号(PID)、终端(TTY)、运行时间(TIME)、产生该进程所运行的命令(CMD)ps命令的常用选项选项说明-e显示所有进程,等价于-A。-f完全(FULL)显示。增加显示用户名、PPID、进程起始时间。f/-H显示进程树,等价于--forest。a显示终端上的所有进程,包括其他用户地进程。x显示没有控制终端地进程。u面向用户的显示格式。增加显示用户名,进程起始时间,CPU和内存占用百分比等信息。-u<username>仅显示指定用户的进程。l/-l长格式显示。增加显示进程的UID、PPID和优先权值。w[w]/-w[w]加宽显示。通常用于显示完整的命令行。o/-o<format>由用户自定义输出列。--sort<order>指定按哪/哪些列排序,order格式为:[+|-]key[,[+|-]key[,...]]ps命令使用举例$ps-e$ps-ef$ps-eH$ps-elw$psau$psaux$psaxf$psauxwps常见的输出标记ps的输出依赖于用户所给的选项UID用户IDSTART进程启动时间USER用户名TIME执行时间PID进程IDSTAT进程状态PPID父进程的IDNI优先权值/nice值TTY启动进程的终端CMD命令名(COMMAND)RSS进程所用内存块数%CPU进程所用CPU时间百分比(pcpu)VSZ进程所用虚拟内存块数%MEM进程所有MEM百分比(pmem)ps命令的进程状态列"STAT"或"S"列的输出R正在运行或处在运行队列中S休眠T停止或被追踪W进程在RAM中没有驻留页(2.6.xx

的内核无效)D不可中断的睡眠,通常指I/OZ僵尸进程(已结束但未被父进程收回)X已死进程(这个状态不会出现)ps命令使用举例(2)指定输出列$psouser,pid,ppid,pcpu,pmem,nice,cmd$ps-eopid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm$psaxostat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm$ps-eo“%p%y%x%n%c“——AIX风格对指定列排序$ps-ef--sortuser,-time$psaux--sort-pcpu$psaux--sort-pmem$psouser,pid,ppid,pcpu,pmem,nice,cmd--sortnice搜索进程搜索指定的进程$psaux|grephttpd$ps-fp$(pgrep-d,-xhttpd)查找符合条件的进程PID$pgrephttpd$pidofhttpd$ps-Chttpd-opid=$pgrep-Uapachehttpd$pgrep-Gstudent-l注销后继续运行进程通常当用户注销后,所有属于该用户的进程将全部被终止如果希望程序在退出系统后仍然能够继续运行,可以使用nohup命令启动该进程例如:$nohup~/bin/mirror_yumrepo_with_rsync.sh--centos\--archi386--exclude-iso&若程序有结果输出,输出结果将会被保存到当前目录下的一个文件名为nohup.out的文件中,若用户在当前目录没有写的权限,则结果将会被保存到用户主目录下的nohup.out文件中。nohup命令[选项][参数][输出文件]&进程调度的优先权进程的优先权决定对CPU的使用进程在运行时可以享有不同等的优先权进程的优先权受进程的nice值的影响这个值的范围是-20到19,默认是0值越小说明对CPU的使用越优先查看进程优先级(看NI列的值)ps-lps-ocomm,nice改变进程调度优先权——在启动进程时指定在启动进程时就指定优先级:nicenice–优先级改变量命令[&]是指优先级的增量若为正,表示增加nice值,即降低进程优先权若为负,表示减小nice值,即提高优先权若缺省,则默认为10,即nice值增加10nice命令举例例:nice–5lppaper.pdf&注:使用nice

同样可以改变前台任务的优先级。例:超级用户(root)忙着打印一份演讲稿:nice–-10lpreport.pdf注:只有root才有权限提高一个进程的优先权。改变进程调度优先权——在进程运行过程中调整进程运行后调整优先级:renice在系统资源紧张时,可以通过降低其它不着急的进程的优先权,从而使得急用的进程能分得更多的CPU时间root可以提高进程的优先权,但普通用户没这个权限调整指定进程的优先级renice优先级[-ppid][-uuser][-ggid]renice5–p2345#-p可以省略注:普通用户一旦增加某个进程的优先级(即降低优先值)后,就无法再回复到原来的优先级。进程信号(signal)进程信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的进程信号是最基本的进程间通讯方式可以在进程之间直接发送,而不需要用户界面可以在Shell中通过kill命令发送给进程Linux对每种进程信号都规定了默认关联动作。查看可用的进程信号$kill-l$man7signal进程信号和信号发送常见的进程信号SIGTERM|TERM(15)——正常终止(默认)SIGKILL|KILL(9)——立即终止SIGHUP|HUP(1)——重读配置文件给进程发送信号按PID:kill[信号]PID…按名称:killall[信号]COMM…按模式:pkill[-信号]模式发送信号可以使用名称或数字号码杀死进程为什么要杀死进程该进程占用了过多的CPU时间该进程锁住了一个终端,使其他前台进程无法运行运行时间过长,但没有预期效果或无法正常退出产生了过多到屏幕或磁盘文件的输出kill/killall命令举例$kill1234OR$kill-91234$killallmyprogOR$killall-9myprog注:(1)使用kill前需要先用ps查看需要终止的进程的pid;(2)kill–9很霸道,它在杀死一个进程的同时,将杀死其所有子进程,使用时要谨慎。如错杀login进程或shell进程等。作业控制作业控制是指控制当前正在运行的进程的行为,也被称为进程控制。暂时停止某个运行程序使用Ctrl-z或发送信号17(STOP)管理后台作业或暂停的作业列举作业号码和名称:jobs在后台恢复运行:bg[%作业号码]在前台恢复运行:fg[%作业号码]发送信号:kill-[信号][%作业号码]本章思考题Linux系统是如何标识用户和组的?什么是标准组?什么是私有组?为什么使用了私有组?什么是主组?什么是附加组?以主组登录后如何切换到附加组?简述私有组和主组的关系,简述标准组和附加组的关系。简述Linux的4个账户系统文件及其各个字段的含义。举例说明创建一个用户账号的详细过程。举例说明如何将一个用户账号添加到一个当前还不存在的组中。如何设置用户口令?如何锁定用户账号?如何设置用户口令时效?本章思考题Linux文件系统的三种基本权限是什么?Linux文件系统的三种特殊权限是什么?何时使用它们?简述chmod命令的两种设置权限的方法。如何更改文件或目录的属主和/或同组人?为什么使用ACL?ACL的两种类型及其作用。本章思考题什么是进程?它与程序有何关系?进程的类型?进程的启动方式?什么是前台进程?什么是后台进程?如何查看进程?如何删除进程?如何更改进程优先级?什么是作业控制?本章思考题学会管理用户和组账号。学会设置用户口令并管理用户口令时效。学会设置文件和目录的操作权限。学会设置和使用ACL权限。学会显示和杀死进程。学会显示和管理守护进程。学会实施作业控制。本章思考题学习SUN的集中式的账户系统NIS服务的配置和使用学习使用OpenLDAP实现的集中式账户管理和应用2.Shell脚本编程01Shell脚本的编制、执行和调试02Shell脚本的成分和编码规范03Shell变量替换扩展、数值计算、输入输出04变量分类,位置参数变量和特殊参数变量05条件测试(文件测试、字符串测试、整数测试)06分支流程控制(if、case)07循环流程控制(for、while、until、select)08函数的定义和调用、返回值09使用循环分析命令行参数学习目标熟悉Shell脚本的编码规范,掌握执行和调试方法01掌握对变量进行整数运算和间接引用的方法02理解位置参数变量和特殊参数变量的用途03掌握条件测试的使用[]、[[]]、(())04学习目标掌握各种流程控制语句的使用if、casefor、while、until、select、break、continue05掌握函数的定义、调用和传递返回值的方法06掌握命令行参数、位置参数的操作(shift、getopts)07Shell脚本和Shell编程当命令不在命令行中执行,而是从一个文件中执行时,该文件就称为Shell脚本。01

0203Shell脚本是纯文本文件。Shell脚本通常以.sh作为后缀名,但不是必须。Shell脚本是以行为单位的,在执行脚本的时候会分解成一行一行依次执行。Shell脚本和Shell编程Shell是一种功能强大的解释型编程语言通常用于完成特定的、较复杂的系统管理任务01Shell脚本语言非常擅长处理文本类型的数据02Shell脚本的成分程序元素保留字、运算符、表达式变量、数组、输入输出控制结构(顺序、分支、循环、子程序调用)Shell脚本的成分Shell功能【参见第2、3章内容】执行命令(内置命令、外部命令、自编程序)重定向、管道、命令替换、命令聚合通配符、注释符、……Shell环境Shell脚本的建立Shell

脚本的建立使用文本编辑器编辑脚本文件$viscript-file为脚本文件添加可执行权限$chmod+xscript-fileShell脚本的执行Shell

脚本的执行在子Shell中执行$bashscript-file$script-file在当前Shell中执行$sourcescript-file$.script-filePATH

环境变量的默认值不包含当前目录,若脚本文件在当前目录,应使用./script-filePATH

环境变量的默认值包含~/bin目录,用户可以将自己的脚本文件存放在~/bin目录,之后即可直接调用脚本文件名执行脚本了Shell脚本的编码规范以#!开头:通知系统用何解释器执行此脚本#!/bin/bash#!/bin/ksh以注释形式说明如下的内容:#脚本名称#脚本功能#作者及联系方式#版本更新记录#版权声明#对算法做简要说明(如果是复杂脚本)Shell脚本举例(1)#!/bin/bash#ThisisthefirstBashshellprogram#Scriptname:greetings.shechoecho

-e"Hello$LOGNAME,\c"echo"it'snicetalkingtoyou."echo

-n"Yourpresentworkingdirectoryis:"pwd

#Showthenameofpresentdirectoryechoecho

-e"Thetimeis`date+%T`!.\nBye"echoShell脚本举例(2)#!/bin/bash##ScriptName:/etc/cron.daily/ntpdate#使用NTP的客户端命令ntpdate与远程NTP服务器进行同步#

也可以用局域网内的NTP服务器替换/usr/sbin/ntpdate

-s#

更改硬件时钟时都会记录在/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]脚本调试1sh–x脚本名该选项可以使用户跟踪脚本的执行,此时shell

对脚本中每条命令的处理过程为:先执行替换,然后显示,再执行它。shell

显示脚本中的行时,会在行首添加一个加号“+”。sh–v脚本名在执行脚本之前,按输入的原样打印脚本中的各行。sh–n脚本名对脚本进行语法检查,但不执行脚本。如果存在语法错误,shell

会报错,如果没有错误,则不显示任何内容。脚本调试举例1对脚本进行语法检查$bash-ngreetings.sh显示脚本中每个原始命令行及其执行结果$bash-vgreetings.sh以调试模式执行脚本$bash-xgreetings.sh脚本调试2——set命令01在脚本内使用set命令开启调试选项set-x:显示由shell执行的命令及其参数set-v:显示由shell读入的命令行set-n:读取命令但不执行他们,用于语法检查02在脚本内使用set命令关闭已开启的调试选项set+xset+vset+n脚本调试举例2$bashgreetings.sh./greetings.sh$sourcegreetings.sh#!/bin/bash#ThisisthefirstBashshellprogram#Scriptname:greetings.shset-x###TurnONdebugmode###echoecho-e"Hello$LOGNAME,\c"echo"it'snicetalkingtoyou."echo-n"Yourpresentworkingdirectoryis:"pwd#Showthenameofpresentdirectoryechoset+x###TurnOFFdebugmode###echo-e"Thetimeis`date+%T`!.\nBye"echoShell脚本的类型030201非交互式脚本不需要读取用户的输入,也不用向用户反馈某些信息每次执行都是可预见的,因为它不读取用户输入,参数是固定的可以在后台执行Shell脚本的类型脚本可以读取用户的输入,实时向用户反馈信息(输出某些信息)这样的脚本更灵活,每次执行时的参数可由用户动态设定交互式脚本用户界面更友好,但不适用于自动化任务(如cron任务)学习Shell编程的前提01掌握一种文本编辑器的使用(Vi)02熟悉Linux文件系统的布局03学习Shell的各种功能重定向、管道、命令替换、命令聚合学习Shell编程的前提04学习各种管理和监视命令的使用用户管理、权限管理、进程管理、包管理……系统监视、网络监视……05学习各种文本文件工具的使用cat、grep、tr、sed、awk……正则表达式系统的配置文件几乎都是纯文本文件Shell变量操作变量替换扩展变量测试变量的字符串操作变量的间接引用变量的数值计算$[expression]$((expression))exprletdeclare-i输入变量赋值name=valuereadonly从标准输入读取read输出echoprintf变量替换扩展——变量测试UseDefaultValues${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的值不变。变量测试举例color=bluenewcolor=${color:-grey}unsetcolorecho"Theskyis${color:-grey}today"echo

$colorecho"Theskyis${color:=grey}today"echo

$colorecho"Theskyis${color:?error}today"echo

$colorecho"Theskyis${color:+blue}today"echo

$color变量替换扩展——字符串计数、截取${#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中可以使用通配符。字符串变量替换扩展举例1str='Ilovelinux.IloveUNIXtoo.’echo${#str}30echo${#str:13}IloveUNIXtoo.echo

${#str:7:5}linuxecho

${str#Ilove}linux.IloveUNIXtoo.echo

${str#I*.}IloveUNIXtoo.echo

${str##I*}变量替换扩展——字符串替换${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

可以是@

或*,表示对每个位置参数进行替换字符串变量替换扩展举例2str='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'aime

linux.IloveUNIXtoo.echo${str//Ilove/"J'aime"}J'aimelinux.J'aimeUNIXtoo.echo

${str/%too./also.}Ilovelinux.IloveUNIXalso.字符串变量替换扩展举例3set1v11v21v31v4echo

$@1v11v21v31v4echo

${@/1/a}av1av2av3av4echo

${@//1/a}avaav2av3av4echo${@/%1/a}1va1v21v31v4变量的间接引用通过str2

的值来引用str1

的值str1="HelloWorld"str2=str1echo

$str2#bash2.0以上才支持newstr=${!str2}echo$newstrHelloWorld或echo${!str2}HelloWorld

eval

newstr=\$$str2echo$newstrHelloWorld或evalecho\$$str2HelloWorld

?变量的间接引用(续)通过x

的值来引用CENTOS_URL

的值x="CENTOS"CENTOS_URL="/centos/"#bash2.0以上才支持newstr=${x}_URLecho

$newstrCENTOS_URLecho${!newstr}/centos/eval

newstr=\$${x}_URLecho

$newstr或eval

echo\$${x}_URLShell内置命令——evallistpage="ls-l|more"eval

$listpageeval

$(ssh-agent)eval

newstr=\$$str2eval

echo

\$${x}_URLeval

arg1[arg2]...[argN]对参数进行两次扫描和替换将所有的参数连接成一个表达式,并计算或执行该表达式参数中的任何变量都将被展开Shell变量的分类专用参数变量(SpecialParameters)用户自定义变量由系统维护,用于设置用户的Shell工作环境只有少数的变量用户可以修改其值Shell环境变量Shell变量的分类通过命令行给程序传递执行参数可用shift命令实现位置参数的迁移位置参数变量(PositionalParameters)Bash预定义的特殊变量用户不能修改其值专用参数变量(SpecialParameters)位置参数变量是一组特殊的内置变量位置参数的用途跟在脚本名后面的用空格隔开的每个字符串$1表示第1个参数值,……,$9表示第9个参数值${10}表示第10个参数值,

${11}表示第11个参数值,……从shell命令/脚本的命令行接受参数在调用shell函数时为其传递参数专用参数变量$*将所有位置参量看成一个字符串(以空格间隔)$@将每个位置参量看成单独的字符串(以空格间隔)“$*”将所有位置参量看成一个字符串(以$IFS间隔)“$@”将每个位置参量看成单独的字符串(以空格间隔)$0命令行上输入的Shell程序名$#

表示命令行上参数的个数命令行参数相关专用参数变量$?表示上一条命令执行后的返回值$$当前进程的进程号$!显示运行在后台的最后一个作业的PID$_在此之前执行的命令或脚本的最后一个参数进程状态相关位置参数和专用参数举例执行脚本$./vartest.sh1‘23’45abcdefg#!/bin/bash#ScriptName:vartest.sh#TotestPositionalParameters&SpecialParameters.echo"Hello,$USER,theoutputofthisscriptareasfollows:"echo"Thescriptnameis:$(basename$0)"echo"Thefirstparamofthescriptis:$1"echo"Thesecondparamofthescriptis:$2"echo"Thetenthparamofthescriptis:${10}"echo"Alltheparamsyouinputare:$@"echo"Alltheparamsyouinputare:$*"echo"Thenumberoftheparamsyouinputare:$#"echo"TheprocessIDforthisscriptis:$$"echo"Theexitstatusofthisscriptis:$?”$@、$*和环境变量IFS执行脚本$./ifsargs.sh1‘23’45abcdefg#!/bin/bash#ScriptName:ifsargs.sh####SettheIFSto|####IFS='|'echo"Command-LineArgumentsDemo"echo"*Allargsdisplayedusing\$@positionalparameter*"echo$@echo"*Allargsdisplayedusing\$*positionalparameter*"echo$*echo'*Allargsdisplayedusing"$@"positionalparameter*'echo"$@"#***doublequoteadded***#echo'*Allargsdisplayedusing"$*"positionalparameter*'echo"$*"#***doublequoteadded***#位置参数和shift命令将位置参量列表依次左移n次,缺省为左移一次一旦位置参量列表被移动,最左端的那个参数就会从列表中删除经常与循环结构语句一起使用,以便遍历每一个位置参数shift

[n]#!/bin/sh#ScriptName:pp_shift.sh#TotestPositionalParameters&Shift.echo"Thescriptnameis:$0"echo'$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4--'$#'="$#"echo'$@':"$@"shift

#向左移动所有的位置参数1次echo'$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4--'$#'="$#"echo'$@':"$@"shift2

#向左移动所有的位置参数2次echo'$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4--'$#'="$#"echo'$@':"$@"$./pp_shift.sh1b3d4f退出/返回状态$?:返回上一条语句或脚本执行的状态0:成功1-255:不成功exit命令exit

命令用于退出脚本或当前Shell

n

是一个从0到255的整数0表示成功退出,非零表示遇到某种失败返回值

被保存在状态变量$?中exitn常见的返回状态码0:执行正确1:通用错误126:命令或脚本没有执行权限127:命令没找到$

echo$$#显示当前进程的PID9245$

echo$?#显示在此之前执行的命令的返回值0$bash

#调用子Shell$echo$$#显示当前进程的PID9474$

exit1#指定返回值并返回父Shell$

echo$?

#显示上一个Shell/脚本的返回值1$list

#执行不存在的命令bash:list:commandnotfound$

echo$?127$

touchbbb.sh$

./bbb.sh#执行不具有执行权限的命令bash:./bbb.sh:Permissiondenied$echo$?126read从键盘输入内容为变量赋值read[-p

"信息"][var1var2...]若省略变量名,则将输入的内容存入REPLY变量结合不同的引号为变量赋值双引号””:允许通过$符号引用其他变量值单引号’’:禁止引用其他变量值,$视为普通字符反撇号

``

:将命令执行的结果输出给变量更多read的用法参见/guide/Getting_User_Input_Via_Keyboardread举例#!/bin/bash#Thisscriptistotesttheusageofread#Scriptname:ex4read.shecho"===examplesfortestingread==="echo-e

"Whatisyourname?\c"readnameecho"Hello$name"echoecho-n"Wheredoyouwork?"readecho"Iguess$REPLYkeepsyoubusy!"echoread-p

"Enteryourjobtitle:"echo"Ithoughtyoumightbean$REPLY."echoecho"===Endofthescript==="只读变量举例

只读变量:是指不能被清除或重新赋值的变量。readonly

variable[lrj@centos1~]$myname=Osmond[lrj@centos1~]$echo$mynameOsmond[lrj@centos1~]$readonly

myname[lrj@centos1~]$unsetmyname-bash:unset:myname:cannotunset:readonlyvariable[lrj@centos1~]$myname="OsmondLiang"-bash:myname:readonlyvariable[lrj@centos1~]$同时输出多行信息使用echoecho

"Line1Line2Line3"cat<<_END_Line1Line2Line3_END_多行内容中不能出现双引号,否则echo

提前结束若确实需要使用双引号,需使用转义字符:\"_END_可以是任意字符串,只要上下一致即可多行内容中不能出现内容为_END_开始的行,否则cat提前结束使用herefile整数运算Bash变量没有严格的类型定义本质上Bash变量都是字符串若一个字面常量或变量的值是纯数字的,不包含字母或其他字符,Bash可以将其视为长整型值,并可做算数运算和比较运算。Bash也允许显式地声明整型变量declare-i变量名算数运算符+、-、*、/(四则运算)**、%(幂运算和模运算,取余数)<<、>>(按位左移和按位右移)&、^、|(按位与、按位异或和按位或)=、+=、-=、*=、/=、%=

<<=、>>=、&=、^=、|=(赋值运算)<、>、<=、>=、==、!=(比较操作符)&&、||(逻辑与和逻辑或)注:按位运算是以二进制形式进行的。算术运算扩展$[expression]

$((expression))num1=$[4+1];echo

$num1num1=$(($num1*2-3));echo

$num1注意${···},$(···),$[···],$((···))

的不同作用用$[···],$((···))

进行整数运算时,括号内变量前的美元符号$可以省略。((num2=2+3**2-1001%5));echo

$num2num2=$((2+3**2-1001%5));echo

$num2echo

$((2+3**2-1001%5))Shell内置命令——letlet内置命令用于算术运算num2=1;echo

$num2letnum2=4+1;echo

$num2letnum2=$num2+1;echo

$num2赋值符号和运算符两边不能留空格!如果将字符串赋值给一个整型变量时,则变量的值为0如果变量的值是字符串,则进行算术运算时设为0letnum2=4+1let"num2=4+1"#用引号忽略空格的特殊含义用let

命令进行算术运算时,最好加双引号。expr通用的表达式计算命令表达式中参数与操作符必须以空格分开。表达式中的运算可以是算术运算,比较运算,字符串运算和逻辑运算。man

exprexpr5%3expr5\*3#乘法符号必须被转义expr2+5\*2-3%2expr

\(2+5\)\*2–3#括号必须被转义浮点数运算bash

只支持整数运算可以通过使用bc

awk

工具来处理浮点数运算n=$(echo"scale=3;13/2"|bc)echo

$nm=`awk'BEGIN{x=2.45;y=3.123;\

printf"%.3f\n",x*y}'`echo

$mprintf命令

printf

可用来按指定的格式输出变量printfformat输出参数列表printf"%-12.5f\n"123.456format以%开头flagfieldwidthprecision格式符-:左对齐+:输出符号0:空白处添0空格:前面加一空格字段宽度小数点后输出位数printf命令(续)printf

命令的格式说明符c字符型g/G浮点数(自动)d十进制整数o八进制e/E浮点数(科学计数法)s字符串f浮点数(小数形式)x/X十六进制printf命令(续)format

中还可以使用\a警铃\t水平制表符\b退后一格\v垂直制表符\n换行\\反斜杠\f换页\”双引号\r回车%%百分号printf命令举例printf

"Thenumberis:%.2f\n"100printf

"%-20s|%12.5f|\n""Joy"10printf

"%-10d%010o%+10x\n"202020printf

"%6d\t%6o\"%6x\"\n"202020例:数组变量

Bash2.x

以上支持一维数组,下标从0开始。variable=(item1item2item2...)variable[n]=valuedeclare

-a

variablevariable=(item1item2item2...)数组的引用${variable[n]}使用declare

声明或直接给变量名加下标来赋值。数组变量举例declare

-a

stustu=(math1101math1102math1103)echo${stu[0]}

#列出stu的第一个元素echo

${stu[*]}

#列出stu的所有元素echo

${#stu[*]}

#给出数组stu中元素的个数

数组与数组元素的删除unset

stu[1]#删除stu的第二个元素unset

stu

#删除整个数组

数组赋值时无须按顺序赋值x[3]=100;echo${x[*]}state=(ME[3]=CA[2]=NT);echo${state[*]}Shell内置命令——declare

内置命令declare可用来声明变量。declare[选项]

variable[=value]选项含义-r将变量设为只读(

readonly

)-x将变量输出到子shell中(export

为全局变量)-i将变量设为整型(integer

)-a将变量设置为一个数组(array

)-f列出函数的名字和定义(

function

)-F只列出函数名declare举例declare–r

myname=osmondunsetmynamedeclare

myname=“OsmondLiang"declare–x

myname2=lrjmyname2=lrjdeclare–x

myname2declaredeclaremyname=osmond例:变量及相关命令小结1echo

$variable

echo

${variable}unset

variablesetreadonly

variableexport

variable=valueexport

-nvariableexport

-pdeclare[选项]

variable=value变量及相关命令小结2basename

dirname

let或expr${var:-word}、${var:=word}、${var:?word}、${var:+word}$0、$1-$9、${n}、$#、$*、$@、$$、$!、$?、$-eval

newstr=\$$str2

、newstr=${!str2}`hostname`、$(hostname)`basename

\`pwd\``、$(basename

$(pwd))$[expression]

、$((expression))变量及相关命令小结3输入readvar1var2...readread–p

"提示"输出printf"%-12.5f\t%d\n"123.458format以%开头flagfieldwidthprecision格式符-:左对齐+:输出符号0:空白处添0空格:前面加一空格字段宽度小数点后输出位数cdefgsox\b\n\r\t\v\\\”%%

REPLY

REPLY输出参数用空格隔开条件测试简介条件测试可以判断某个特定条件是否满足测试之后通常会根据不同的测试值选择执行不同任务条件测试的种类命令成功或失败表达式为真或假

条件测试简介条件测试的值Bash中没有布尔类型变量退出状态为0表示命令成功或表达式为真非0则表示命令失败或表达式为假状态变量$?

中保存了退出状态的值条件测试举例(1)$

User=osmond$

grep

^$User/etc/passwd$

echo$?$

grep^$User/etc/passwd>/dev/null\

&&echo“$User

isauserin/etc/passwd.”\

||echo“$User

isn’tauserin/etc/passwd.”$

Host=centos1$

ping–c1$Host$

echo$?$

ping–c1$Host>/dev/null\

&&echo“$Host

isup.”\

||echo“$Host

isdown.”条件测试语句说明格式1和格式2是等价的,格式3是扩展的test命令在[[]]中可以使用通配符进行模式匹配&&,||,

<,

和>能够正常存在于[[]]中,但不能在

[]中出现[和[[之后的字符必须为空格,]和]]之前的字符必须为空格要对整数进行关系运算也可以使用(())进行测试语句格式1

test<测试表达式>格式2[<测试表达式>]格式3

[<测试表达式>]条件测试操作符条件测试表达式中可用的操作符文件测试操作符字符串测试操作符整数二元比较操作符使用逻辑运算符文件测试[

-ffname

]fname

存在且是普通文件时,返回真(即返回0)[

-L

fname

]fname

存在且是链接文件时,返回真[

-d

fname

]fname

存在且是一个目录时,返回真[

-e

fname

]fname(文件或目录)存在时,返回真[

-s

fname

]fname

存在且大小大于0时,返回真[

-r

fname

]fname(文件或目录)存在且可读时,返回真[

-w

fname

]fname(文件或目录)存在且可写时,返回真[

-x

fname

]fname(文件或目录)存在且可执行时,返回真测试:文件是否存在,文件属性,访问权限等。更多文件测试符参见test

的在线帮助mantest使用lftp同步yum仓库#!/bin/bash##ScriptName:sync_iredmail_yum_repo.shDIST=5ARCH="i386"EXCL_ARCH="x86_64"SRC=/yum/rpms/$DIST/DST=/var/ftp/yum/repos/iredmail/$DIST/$ARCH/[!-e$DST]

&&

mkdir-p$DSTexcludes="\"(${EXCL_ARCH})|(repodata)\""cd

$DSTlftp

-e"setmirror:exclude-regex$excludes&&\mirror--delete--only-newer--verbose&&exit"$SRCcreaterepo

.>/dev/null使用reposync同步仓库#!/bin/bash##ScriptName:sync_atomic-repo_with_reposync.shARCH="i386"url="/channels/atomic/centos/5"release="atomic-release-1.0-13.el5.art.noarch.rpm"rpm-U$url/$ARCH/RPMS/$releaserpm--import/etc/pki/rpm-gpg/RPM-GPG-KEY.art.txt使用reposync同步仓库之前首先要配置仓库安装atomic-release的RPM包导入其RPM公钥对yum和reposync使用不同的配置文件yum

使用本地仓库配置以加快更新速度/etc/yum.conf和/etc/yum.repos.d/atomic.reporeposync使用运程仓库配置/etc/reposync.conf和/etc/yum/repos.d/atomic.repo使用reposync同步仓库续1[!-f/etc/reposync.conf

]&&(cp/etc/yum.conf/etc/reposync.conf;echo"reposdir=/etc/yum.repos.d">>/etc/yum.conf;echo"reposdir=/etc/yum/repos.d">>/etc/reposync.conf;mkdir/etc/yum/repos.d;mv/etc/yum.repos.d/atomic.repo/etc/yum/repos.d;cat<<__END__>/etc/yum.repos.d/atomic.repo[atomic]name=CentOS/RedHatEnterpriseLinux\$releasever-baseurl=file:///var/ftp/yum/repos/atomic/centos/5/$ARCH/atomicenabled=1priority=1protect=0gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY.art.txtgpgcheck=1__END__)配置对yum和reposync使用不同的配置文件仅当/etc/reposync.conf不存在时执行一次(……)使用reposync同步仓库续2若本地同步的目标目录不存在创建之,否则进入之使用

reposync

同步仓库的RPM文件-a,--arch:指定架构(i386、x86_64)-r,--repoid:指定要同步的仓库名-d,--delete:删除本地存在而远程已经不存在的文件-c,--config:指定reposync使用的配置文件使用createrepo创建仓库(repodata)DST="/var/ftp/yum/repos/atomic/centos/5/$ARCH"[!-e$DST]

&&

mkdir-p$DST||

cd$DST/usr/bin/yumcleanall/usr/bin/reposync

--arch=$ARCH--repoid=atomic\

-d-c/etc/reposync.confcdatomic/usr/bin/createrepo

./usr/bin/yumcleanall字符串测试[

-z

string

]如果字符串string长度为0,返回真[

-n

string

]如果字符串string长度不为0,返回真[

str1

=

str2

]两字符串相等(也可使用==)返回真[

str1

!=

str2

]两字符串不等返回真[[

str1

==

str2

]]两字符串相同返回真[[

str1

!=

str2

]]两字符串不相同返回真[[

str1

=~

str2

]]str2是str1的子串返回真[[

str1

>

str2

]]str1大于str2返回真[[

str1

<

str2

]]str1小于str2返回真字符串按从左到右对应字符的ASCII码进行比较字符串的空值检查[-z"$name"][!

"$name"][

"X${name}"

=

"X"][-n"$name"

]["$name"][

"X${name}"

!=

"X"]检查空值检查非空值[

"$name"

=

""]["$name"!=

""]整数测试(1)[

int1

-eq

int2

]

int1等于

int2返回真[

int1

-ne

int2

]

int1不等于int2返回真[

int1

-gt

int2

]

int1大于

int2返回真[

int1

-ge

int2

]

int1大于或等于int2返回真[

int1

-lt

int2

]

int1小于

int2返回真[

int1

-le

int2

]

int1小于或等于int2返回真[[

int1

-eq

int2

]]

int1等于

int2返回真[[

int1

-ne

int2

]]

int1不等于int2返回真[[

int1

-gt

int2

]]

int1大于

int2返回真[[

int1

-ge

int2

]]

int1大于或等于int2返回真[[

int1

-lt

int2

]]

int1小于

int2返回真[[

int1

-le

int2

]]

int1小于或等于int2返回真操作符两边必须留空格!整数测试(2)((int1==int2))

int1等于

int2返回真((int1!=int2))

int1不等于int2返回真((int1

>

int2))

int1大于

int2返回真((int1

>=int2))

int1大于或等于int2返回真((int1

<

int2))

int1小于

int2返回真((int1<=int2))

int1小于或等于int2返回真操作符两边的空格可省略!条件测试举例(2)$[$a!=$b];echo$?0$[[$a!=$b]];echo$?0$[$n-gt$m];echo$?1$[[$n>$m]];echo$?1$((n>m));echo$?1$(($n>$m));echo$?1$[[n>m]];echo$?0$a=linux;b=unix$n=5;m=7$[$a!=$b]&&echoT||echoFT$[[$a!=$b]]&&echoT||echoFT$[$n-gt$m]&&echoT||echoFT$[[$n>$m]]&&echoT||echoFF$((n>m))&&echoT||echoFF$(($n>$m))&&echoT||echoFF$[[n>m]]&&echoT||echoFT条件测试举例(3)name=Tom;[-z$name];

echo$?name2=Andy;[$name

=$name2

]

;

echo$?name=Tom

[$name

=[Tt]??

]

echo$?name=Tom

[[$name

=[Tt]??

]]

echo$?方括号前后要留空格!x=1;[$x

-eq

1

];

echo$?x=a;[$x

-eq

1

];

echo$

温馨提示

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

评论

0/150

提交评论