Linux-基础教程--Shell脚本编程1.ppt
本章内容要点nShell 脚本的编制、执行和调试nShell 脚本的成分和编码规范nShell 变量替换扩展、数值计算、输入输出n变量分类,位置参数变量和特殊参数变量n条件测试(文件测试、字符串测试、整数测试)n分支流程控制(if、case)n循环流程控制(for、while、until、select)n函数的定义和调用、返回值n使用循环分析命令行参数本章学习目标 n熟悉Shell 脚本的编码规范,掌握执行和调试方法n掌握对变量进行整数运算和间接引用的方法n理解位置参数变量和特殊参数变量的用途n掌握条件测试的使用 、()n掌握各种流程控制语句的使用qif、caseqfor、while、until、select、break、continuen掌握函数的定义、调用和传递返回值的方法n掌握命令行参数、位置参数的操作(shift、getopts)SHELL编程基础编程基础Shell脚本和Shell编程n当命令不在命令行中执行,而是从一个文件中执行时,该文件就称为 Shell 脚本。qShell 脚本是纯文本文件。qShell 脚本通常以 .sh 作为后缀名,但不是必须。qShell 脚本是以行为单位的,在执行脚本的时候会分解成一行一行依次执行。nShell 是一种功能强大的解释型编程语言q通常用于完成特定的、较复杂的系统管理任务qShell 脚本语言非常擅长处理文本类型的数据Shell脚本的成分n程序元素q保留字、运算符、表达式q变量、数组、输入输出q控制结构(顺序、分支、循环、子程序调用)nShell功能 【参见第2、3章内容】q执行命令(内置命令、外部命令、自编程序)q重定向、管道、命令替换、命令聚合重定向、管道、命令替换、命令聚合q通配符、注释符、qShell环境Shell 脚本的建立与执行nShell 脚本的建立q使用文本编辑器编辑脚本文件$ vi script-fileq为脚本文件添加可执行权限$ chmod +x script-filenShell 脚本的执行q在子Shell中执行$ bash script-file$ script-fileq在当前Shell中执行$ source script-file$ . script-filePATH 环境变量的默认值不包含当前目录,若脚本文件在当前目录,应使用 ./script-filePATH 环境变量的默认值包含 /bin 目录,用户可以将自己的脚本文件存放在 /bin 目录,之后即可直接调用脚本文件名执行脚本了Shell 脚本的编码规范n以 #! 开头:通知系统用何解释器执行此脚本#!/bin/bash#!/bin/kshn以注释形式说明如下的内容:# 脚本名称# 脚本功能# 作者及联系方式# 版本更新记录# 版权声明# 对算法做简要说明(如果是复杂脚本)Shell脚本举例(1)#!/bin/bash# This is the first Bash shell program # Scriptname: greetings.shechoecho -e Hello $LOGNAME, cecho its nice talking to you.echo -n Your present working directory is: pwd # Show the name of present directoryechoecho -e The time is date +%T!. nByeechoShell脚本举例(2)#!/bin/bash# Script Name:/etc/cron.daily/ntpdate# 使用使用NTP的客户端命令的客户端命令ntpdate与远程与远程NTP服务器进行同步服务器进行同步# 也可以用局域网内的也可以用局域网内的NTP服务器替换服务器替换 pool.ntp.org/usr/sbin/ntpdate -s pool.ntp.org# 更改硬件时钟时都会记录在更改硬件时钟时都会记录在/etc/adjtime文件中文件中# 使使hwclock根据先前的记录来估算硬件时钟的偏差,根据先前的记录来估算硬件时钟的偏差,# 并用来校正目前的硬件时钟并用来校正目前的硬件时钟/sbin/hwclock -adjust# 将系统时钟同步到硬件时钟将系统时钟同步到硬件时钟/sbin/hwclock systohc 脚本调试方法n在 bash 调用脚本时使用参数$ bash -x -n -v scriptNamen在脚本中使用 bash 内置的 set 命令使整个或部分脚本处于调试模式开启:开启:set -x -n -v结束:结束:set +x +n +v脚本调试 1sh x 脚本名该选项可以使用户跟踪脚本的执行,此时 shell 对脚本中每条命令的处理过程为:先执行替换,然后显示,再执行它。shell 显示脚本中的行时,会在行首添加一个加号 “ + ”。sh v 脚本名在执行脚本之前,按输入的原样打印脚本中的各行。sh n 脚本名对脚本进行语法检查,但不执行脚本。如果存在语法错误,shell 会报错,如果没有错误,则不显示任何内容。脚本调试举例 1n对脚本进行语法检查$ bash -n greetings.shn显示脚本中每个原始命令行及其执行结果$ bash -v greetings.shn以调试模式执行脚本$ bash -x greetings.sh脚本调试 2 set命令n在脚本内使用set命令开启调试选项qset -x :显示由shell执行的命令及其参数qset -v :显示由shell读入的命令行qset -n :读取命令但不执行他们,用于语法检查n在脚本内使用set命令关闭已开启的调试选项qset +xqset +vqset +n脚本调试举例 2$ bash greetings.sh./greetings.sh$ source greetings.sh#!/bin/bash# This is the first Bash shell program # Scriptname: greetings.shset -x # Turn ON debug mode #echoecho -e Hello $LOGNAME, cecho its nice talking to you.echo -n Your present working directory is: pwd # Show the name of present directoryechoset +x # Turn OFF debug mode #echo -e The time is date +%T!. nByeechoShell脚本的类型n非交互式脚本q不需要读取用户的输入, 也不用向用户反馈某些信息q每次执行都是可预见的, 因为它不读取用户输入, 参数是固定的q可以在后台执行n交互式脚本q脚本可以读取用户的输入, 实时向用户反馈信息(输出某些信息)q这样的脚本更灵活, 每次执行时的参数可由用户动态设定q用户界面更友好,但不适用于自动化任务(如cron任务)学习Shell编程的前提n掌握一种文本编辑器的使用(Vi)n熟悉 Linux 文件系统的布局n学习 Shell 的各种功能q重定向、管道、命令替换、命令聚合n学习各种管理和监视命令的使用q用户管理、权限管理、进程管理、包管理q系统监视、网络监视 n学习各种文本文件工具的使用qcat、grep、tr、sed、awk q正则表达式系统的配置文件几乎都是纯文本文件变量和表达式变量和表达式Shell 变量操作变量操作n变量替换扩展q变量测试q变量的字符串操作q变量的间接引用n变量的数值计算q$expression q$(expression)qexprqletqdeclare -in输入q变量赋值nname=valuenreadonlyq从标准输入读取nreadn输出qechoqprintf变量替换扩展变量测试Use Default Values$var:-word若若var存在且非空存在且非空,则值为则值为$var;若若var未定义或为空值未定义或为空值,则值为则值为word,但,但var的值不变。的值不变。Assign Default Values$var:=word若若var存在且非空存在且非空,则值为则值为$var;若若var未定义或为空值未定义或为空值,则值为则值为word,且,且var被赋值被赋值word。Display Error if Null or Unset$var:?word若若var存在且非空存在且非空,则值为则值为$var;若若var未定义或为空值未定义或为空值,则输出信则输出信息息word,并终止脚本。,并终止脚本。Use Alternate Value$var:+word若若var存在且非空存在且非空,则值为则值为word;否则返回空值,但否则返回空值,但var的值不变。的值不变。变量测试举例color=bluenewcolor=$color:-greyunset colorecho The sky is $color:-grey todayecho $color echo The sky is $color:=grey todayecho $color echo The sky is $color:?error todayecho $color echo The sky is $color:+blue todayecho $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=I love linux. I love UNIX too.echo $#str30echo $#str:13I love UNIX too.echo $#str:7:5linuxecho $str#I lovelinux. I love UNIX too.echo $str#I*.I love UNIX too.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=I love linux. I love UNIX too.echo $str/love/likeI like linux. I love UNIX too.echo $str/love/likeI like linux. I like UNIX too.echo $str/I*linux/I like FreeBSDI like FreeBSD. I love UNIX too.echo $str/#I love/JaimeJaime linux. I love UNIX too.echo $str/I love/JaimeJaime linux. Jaime UNIX too. echo $str/%too./also.I love linux. I love UNIX also.字符串变量替换扩展举例3set 1v1 1v2 1v3 1v4echo $1v1 1v2 1v3 1v4echo $/1/aav1 av2 av3 av4echo $/1/aava av2 av3 av4echo $/%1/a1va 1v2 1v3 1v4变量的间接引用n通过 str2 的值来引用 str1 的值str1=Hello Worldstr2=str1echo $str2 bash2.0以上才支持以上才支持newstr=$!str2echo $newstrHello World或或echo $!str2Hello World eval newstr=$str2echo $newstrHello World或或eval echo $str2Hello World ?变量的间接引用(续)n通过 x 的值来引用 CENTOS_URL 的值x=CENTOSCENTOS_URL=http:/ bash2.0以上才支持以上才支持newstr=$x_URLecho $newstrCENTOS_URLecho $!newstrhttp:/ eval newstr=$x_URLecho $newstr或或eval echo $x_URLShell内置命令evallistpage=ls -l | moreeval $listpageeval $(ssh-agent)eval newstr=$str2eval echo $x_URL eval arg1 arg2 . argNl对参数进行两次扫描和替换l 将所有的参数连接成一个表达式,并计算或执行该表达式l 参数中的任何变量都将被展开Shell 变量的分类变量的分类n用户自定义变量用户自定义变量q由用户自己定义、修改和使用nShell Shell 环境变量环境变量q由系统维护,用于设置用户的Shell工作环境q只有少数的变量用户可以修改其值n位置参数变量位置参数变量(Positional Parameters)q通过命令行给程序传递执行参数q可用 shift 命令实现位置参数的迁移n专用参数变量专用参数变量(Special Parameters)qBash 预定义的特殊变量q用户不能修改其值位置参数变量n是一组特殊的内置变量q跟在脚本名后面的用空格隔开的每个字符串q$1 表示第1个参数值,$9 表示第9个参数值q$10 表示第10个参数值, $11 表示第11个参数值, n位置参数的用途q从 shell 命令/脚本 的命令行接受参数q在调用 shell 函数时为其传递参数专用参数变量n命令行参数相关命令行参数相关q$* 将所有位置参量看成一个字符串(以空格间隔) 。q$ 将每个位置参量看成单独的字符串(以空格间隔)。q “$*” 将所有位置参量看成一个字符串(以$IFS间隔)。q “$” 将每个位置参量看成单独的字符串(以空格间隔) 。q$0 命令行上输入的Shell程序名。q$# 表示命令行上参数的个数。n进程状态相关进程状态相关q$? 表示上一条命令执行后的返回值q$ 当前进程的进程号q$! 显示运行在后台的最后一个作业的 PID q$_ 在此之前执行的命令或脚本的最后一个参数位置参数和专用参数举例n执行脚本$ ./vartest.sh 1 2 3 4 5 a b c d e f g#!/bin/bash# ScriptName: vartest.sh# To test Positional Parameters & Special Parameters.echo Hello,$USER,the output of this script are as follows:echo The script name is : $(basename $0)echo The first param of the script is : $1echo The second param of the script is : $2echo The tenth param of the script is : $10echo All the params you input are : $echo All the params you input are : $*echo The number of the params you input are: $#echo The process ID for this script is : $echo The exit status of this script is : $?”$、$*和环境变量IFSn执行脚本$ ./ifsargs.sh 1 2 3 4 5 a b c d e f g#!/bin/bash# ScriptName: ifsargs.sh# Set the IFS to | #IFS=|echo Command-Line Arguments Demo“echo * All args displayed using $ positional parameter *echo $echo * All args displayed using $* positional parameter *echo $*echo * All args displayed using $ positional parameter *echo $ #* double quote added *#echo * All args displayed using $* positional parameter *echo $* #* double quote added *#位置参数和 shift 命令n将位置参量列表依次左移n次,缺省为左移一次n一旦位置参量列表被移动,最左端的那个参数就会从列表中删除n经常与循环结构语句一起使用,以便遍历每一个位置参数shift n#!/bin/sh# ScriptName: pp_shift.sh# To test Positional Parameters & Shift.echo The script name is : $0echo $1=$1,$2=$2,$3=$3,$4=$4 - $#=$# echo $: $ shift # 向左移动所有的位置参数向左移动所有的位置参数1次次echo $1=$1,$2=$2,$3=$3,$4=$4 - $#=$#echo $: $shift 2 # 向左移动所有的位置参数向左移动所有的位置参数2次次echo $1=$1,$2=$2,$3=$3,$4=$4 - $#=$#echo $: $ ./pp_shift.sh 1 b 3 d 4 f退出/返回状态n$?:返回上一条语句或脚本执行的状态返回上一条语句或脚本执行的状态q0:成功q1255:不成功nexit 命令命令qexit 命令用于退出脚本或当前Shell nn 是一个从 0 到 255 的整数n0 表示成功退出,非零表示遇到某种失败n返回值 被保存在状态变量 $? 中exit n常见的返回状态码n0:n执行正确n1:n通用错误n126:n命令或脚本没有执行权限n127:n命令没找到$ echo $ # 显示当前进程的显示当前进程的 PID9245$ echo $? # 显示在此之前执行的命令的返回值显示在此之前执行的命令的返回值0$ bash # 调用子调用子Shell$ echo $ # 显示当前进程的显示当前进程的 PID9474$ exit 1 # 指定返回值并返回父指定返回值并返回父Shell$ echo $? # 显示上一个显示上一个Shell/脚本的返回值脚本的返回值1$ list # 执行不存在的命令执行不存在的命令bash: list: command not found$ echo $?127$ touch bbb.sh$ ./bbb.sh # 执行不具有执行权限的命令执行不具有执行权限的命令bash: ./bbb.sh: Permission denied$ echo $?126readn从键盘输入内容为变量赋值qread -p 信息信息 var1 var2 .q若省略变量名,则将输入的内容存入REPLY变量n结合不同的引号为变量赋值q双引号 ” ”:允许通过$符号引用其他变量值q单引号 :禁止引用其他变量值,$视为普通字符q反撇号 :将命令执行的结果输出给变量n更多read的用法参见qhttp:/bash.cyberciti.biz/guide/Getting_User_Input_Via_Keyboardread 举例#!/bin/bash# This script is to test the usage of read# Scriptname: ex4read.shecho = examples for testing read =echo -e What is your name? cread nameecho Hello $nameechoecho -n Where do you work? readecho I guess $REPLY keeps you busy!echoread -p Enter your job title: echo I thought you might be an $REPLY.echoecho = End of the script =只读变量n举例q 只读变量readonly variable是指不能被清除或重新赋值的变量。lrjcentos1 $ myname=Osmondlrjcentos1 $ echo $mynameOsmondlrjcentos1 $ readonly mynamelrjcentos1 $ unset myname-bash: unset: myname: cannot unset: readonly variablelrjcentos1 $ myname=Osmond Liang-bash: myname: readonly variablelrjcentos1 $同时输出多行信息n使用 echon使用 here fileecho Line1Line2Line3cat _END_Line1Line2Line3_END_ 多行内容中不能出现双引号,否则多行内容中不能出现双引号,否则 echo 提前结束提前结束 若确实需要使用双引号,需使用转义字符:若确实需要使用双引号,需使用转义字符: _END_可以是任意字符串,只要上下一致即可可以是任意字符串,只要上下一致即可 多行内容中不能出现内容为多行内容中不能出现内容为_END_开始开始的行,否的行,否则则 cat 提前结束提前结束整数运算nBash 变量没有严格的类型定义q本质上 Bash 变量都是字符串n若一个字面常量或变量的值是纯数字的,不包含字母或其他字符, Bash可以将其视为长整型值,并可做算数运算和比较运算。nBash 也允许显式地声明整型变量qdeclare -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内置命令letnlet 内置命令用于算术运算num2=1; echo $num2let num2=4+1; echo $num2let num2=$num2+1; echo $num2l 赋值符号和运算符两边不能留空格!l 如果将字符串赋值给一个整型变量时,则变量的值为 0l 如果变量的值是字符串,则进行算术运算时设为 0let num2=4 + 1let num2=4 + 1 # 用引号忽略空格的特殊含义用引号忽略空格的特殊含义用用 let 命令进行算术运算时,最好加双引号。命令进行算术运算时,最好加双引号。exprn通用的表达式计算命令q表达式中参数与操作符必须以空格分开。q表达式中的运算可以是算术运算,比较运算,字符串运算和逻辑运算。man exprexpr 5 % 3expr 5 * 3 # 乘法符号必须被转义乘法符号必须被转义expr 2 + 5 * 2 - 3 % 2expr ( 2 + 5 ) * 2 3 # 括号必须被转义括号必须被转义浮点数运算nbash 只支持整数运算n可以通过使用 bc 或 awk 工具来处理浮点数运算n=$(echo scale=3; 13/2 | bc )echo $nm=awk BEGINx=2.45;y=3.123; printf %.3fn, x*yecho $mprintf 命令q printf 可用来按指定的格式输出变量printf format 输出参数列表输出参数列表printf %-12.5fn 123.456format以%开头flagfield widthprecision格式符格式符-:左对齐左对齐+:输出符号输出符号0:空白处添空白处添0空格空格:前面加一空格前面加一空格字段宽度小数点后输出位数printf 命令(续)printf 命令的格式说明符c字符型字符型g/G浮点数(自动)浮点数(自动)d十进制整数十进制整数o八进制八进制e/E 浮点数(科学计数法)浮点数(科学计数法)s字符串字符串f浮点数(小数形式)浮点数(小数形式)x/X十六进制十六进制format 中还可以使用a警铃警铃t水平制表符水平制表符b退后一格退后一格v垂直制表符垂直制表符n换行换行反斜杠反斜杠f换页换页”双引号双引号r回车回车%百分号百分号printf 命令举例printf The number is: %.2fn 100printf %-20s|%12.5f|n Joy 10printf %-10d%010o%+10 xn 20 20 20printf %6dt%6o%6xn 20 20 20例:数组变量q Bash 2.x 以上支持一维数组,下标从 0 开始。variable=(item1 item2 item2 . )variablen=valuedeclare -a variablevariable=(item1 item2 item2 . )q 数组的引用$variablenq 使用 declare 声明或直接给变量名加下标来赋值。数组变量举例declare -a stustu=(math1101 math1102 math1103)echo $stu0 # 列出列出stu的第一个元素的第一个元素echo $stu* # 列出列出stu的所有元素的所有元素echo $#stu* # 给出数组给出数组stu中元素的个数中元素的个数q 数组与数组元素的删除unset stu1 # 删除删除stu的第二个元素的第二个元素unset stu # 删除删除整个数组整个数组q 数组赋值时无须按顺序赋值x3=100; echo $x*state=(ME 3=CA 2=NT); echo $state*Shell内置命令declareq 内置命令 declare 可用来声明变量。declare 选项选项 variable=value选项选项含义含义-r将变量设为只读将变量设为只读 ( readonly )-x将变量输出到子将变量输出到子 shell 中(中(export 为全局变量)为全局变量)-i将变量设为整型将变量设为整型 ( integer )-a将变量设置为一个数组将变量设置为一个数组 ( array )-f列出函数的名字和定义列出函数的名字和定义 ( function )-F只列出函数名只列出函数名declare 举例declare r myname=osmondunset mynamedeclare myname=“Osmond Liangdeclare x myname2=lrjmyname2=lrjdeclare x myname2declaredeclare myname=osmond例:变量及相关命令小结1echo $variable 或或 echo $variableunset variablesetreadonly variableexport variable=valueexport -n variable export -pdeclare 选项选项 variable=value变量及相关命令小结2basename dirname let 或或 expr$var:-word、$var:=word、$var:?word、$var:+word$0、$1-$9、$n、$#、$*、$、$、$!、$?、$-eval newstr=$str2 、newstr=$!str2hostname 、$(hostname)basename pwd 、 $(basename $(pwd)$expression 、$(expression)变量及相关命令小结3q 输入read var1 var2 .readread p 提示提示q 输出printf %-12.5f t %d n 123.45 8format以以%开头开头flagfield widthprecision格式符格式符-:左对齐左对齐+:输出符号输出符号0:空白处添空白处添0空格空格:前面加一空格前面加一空格字段宽度字段宽度小数点后输出位数小数点后输出位数cdefgsoxbnrtv”% REPLY REPLY输出参数用空格隔开输出参数用空格隔开条件测试条件测试条件测试简介n条件测试可以判断某个特定条件是否满足q测试之后通常会根据不同的测试值选择执行不同任务n条件测试的种类q命令成功或失败q表达式为真或假n条件测试的值qBash中没有布尔类型变量n退出状态为 0 表示命令成功或表达式为真n非非0 则表示命令失败或表达式为假q状态变量 $? 中保存了退出状态的值条件测试举例(1)$ User=osmond$ grep $User /etc/passwd$ echo $? $ grep $User /etc/passwd /dev/null & echo “$User is a user in /etc/passwd.” | echo “$User isnt a user in /etc/passwd.”$ Host=centos1$ ping c 1 $Host$ echo $? $ ping c 1 $Host /dev/null & echo “$Host is up.” | echo “$Host is down.”条件测试语句n语句q格式1: test q格式2: q格式3: (bash 2.x 版本以上)n说明q格式1 和 格式2 是等价的,格式3是扩展的 test 命令q在 中可以使用通配符进行模式匹配可以使用通配符进行模式匹配q&, |, 能够正常存在于 中,但不能在 中出现q和之后的字符必须为空格,和之前的字符必须为空格q要对整数进行关系运算也可以使用 () 进行测试条件测试操作符n条件测试表达式中可用的操作符q文件测试操作符q字符串测试操作符q整数二元比较操作符q使用逻辑运算符文件测试 -f fname fname 存在且是普通文件时,返回真 ( 即返回 0 ) -L fname fname 存在且是链接文件时,返回真 -d fname fname 存在且是一个目录时,返回真 -e fname fname(文件或目录)存在时,返回真 -s fname fname 存在且大小大于 0 时,返回真 -r fname fname(文件或目录)存在且可读时,返回真 -w fname fname(文件或目录)存在且可写时,返回真 -x fname fname(文件或目录)存在且可执行时,返回真q测试:文件是否存在,文件属性,访问权限等。l 更多文件测试符参见 test 的在线帮助man test使用lftp同步yum仓库#!/bin/bash# Script Name: sync_iredmail_yum_repo.shDIST=5ARCH=i386EXCL_ARCH=x86_64 SRC=http:/iredmail.org/yum/rpms/$DIST/DST=/var/ftp/yum/repos/iredmail/$DIST/$ARCH/ ! -e $DST & mkdir -p $DSTexcludes=($EXCL_ARCH)|(repodata)cd $DSTlftp -e set mirror:exclude-regex $excludes & mirror -delete -only-newer -verbose & exit $SRCcreaterepo . /dev/null使用reposyncreposync同步仓库#!/bin/bash# Script Name: sync_atomic-repo_with_reposync.shARCH=i386url=http:/ -U $url/$ARCH/RPMS/$releaserpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY.art.txtn使用 reposync 同步仓库之前首先要配置仓库q安装 atomic-release 的RPM包q导入其RPM公钥n对 yum 和 reposync 使用不同的配置文件qyum 使用本地仓库配置以加快更新速度n/etc/yum.conf 和 /etc/yum.repos.d/atomic.repoqreposync 使用运程仓库配置n/etc/reposync.conf 和 /etc/yum/repos.d/atomic.repo使用reposyncreposync同步仓库续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 /etc/yum.repos.d/atomic.repoatomicname = CentOS / Red Hat Enterprise Linux $releasever - baseurl = file:/var/ftp/yum/repos/atomic/centos/5/$ARCH/atomicenabled = 1priority = 1protec