《Bash脚本编程基础》PPT课件.ppt_第1页
《Bash脚本编程基础》PPT课件.ppt_第2页
《Bash脚本编程基础》PPT课件.ppt_第3页
《Bash脚本编程基础》PPT课件.ppt_第4页
《Bash脚本编程基础》PPT课件.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

Bash脚本编程基础,,课程目标,掌握Bash的类型与配置 掌握Bash基本语法 掌握监控程序的编写 掌握Bash结构化编程,内容导航,Bash基础 Bash语法 监控实例,Bash基础,Shell与Bash、sh Bash的类型 Bash命令的解释过程 Bash与Vim配置,Shell,伪终端,SHELL 循环接收 用户输入 解释执行,OS,硬盘 I/O,网络 I/O,其它操作,用户侧,主机侧,控制台,用户,Term,Kernel,Bash的类型,Login Bash,什么是 Login Bash Login 时 Bash做了什么,全局配置 /etc/profile 个人配置 /.bash_profile /.bash_login /.profile,咦, 好像没提到 /etc/profile.d/ ?,SUSE: 确保文件可读 SLK: 确保文件可读可执行,Login sh,login sh和login bash是一样的吗?,Login sh只读取: /etc/profile /.profile,查看: ps; /etc/passwd,指定: useradd -s /bin/bash,修改:usermod, chsh,Interactive Bash,什么是交互式Bash 启动交互式Bash时,Bash做了什么,/etc/bash.bashrc /.bashrc,source,为了统一管理,在login 的时候自动执行 /.bashrc,test -r $HOME/.bashrc & source $HOME/.bashrc 更详细资料见 man bash: INVOCATION,Bash脚本,常见问题: #! /bin/bash 的位置 来自windows的CRLF的换行符 脚本的权限位 Bash的退出码,Bash脚本的执行,父shell Fork一sub-shell Sub-shell继承父shell环境 Sub-shell调用指定的解释器解释执行该脚本 Sub-shell退出, 相关环境被销毁 父shell取得sub-shell的退出状态,1、brace expansion(花括号扩展) 2、tilde expansion(波浪线扩展) 3、parameter,variable expansion(变量扩展) 4、arithmetic expansion(算术扩展) 5、command substitution(命令替换) 6、word splitting(词的拆分) 7、pathname expansion(路径名扩展),可扩展成用户的$HOME值 cd echo samli var=samli,将带$的变量名扩展成变量值 var=”xzy” echo $var,整数算术运算 ( i+ ) ( 10 = 5 ) ( sum = i + j ) Sum=$( I + j ),echo 110 mkdir /data1,2,3,4 a=/a/b/c echo $a%/* $a#*/,变量值按空白符、换行拆分, 如 var=”a b c” for v in $var; do echo $v done,取得命令的输出: Today=$( date +%F ) Line=$( grep xxx yyy ),通配符扩展成文件名 rm *.bak ls ?.bak iso=$( ls xXpP.iso ) hdd=$( ls /dev/sda1-9*),Bash命令的解析过程,Bash脚本与Vim配置,/etc/vimrc 或 /.vimrc中配置,syntax on “ 语法高亮 set number “ 显示行数 set shiftwidth=4 “ 四格缩进 set tabstop=4 “ 四格缩进 set expandtab “ tab转space set bg=light “ 背景为亮色 color murphy “ 配色方案,内容导航,Bash基础 Bash语法 监控实例,变量 数值运算 流程控制 函数,Bash语法,变量,变量定义: name=value 变量引用: $name 注意: =号两边不允许空格 $name是$name的简写,变量,命令替换, command $( command ) # 推荐,例 files=$( ls *.bak ) today=$( date +%F ) lines=$( cat file ),常用变量,$? 上个命令的退出状态 $! 最后一个后台进程的pid $0 当前脚本的名字 $ 当前脚本的pid $n n为1,2.n, 脚本或函数的参数 $ 脚本或函数的所有参数 $# 脚本或函数的参数个数,$UID 当前用户的uid $LOGNAME 当前用户名 $HOSTNAME 主机名 $RANDOM 1-32767间的随机数 $SECONDS 已经消耗的秒数 $PWD 当前的工作目录 $OLDPWD 最后一次cd前的工作目录 $HISTTIMEFORMAT ?,环境变量,环境变量是Bash或用户预设置的变量,可被继承并直接使用 有些环境变量会影响shell的行为,$PATH 命令搜索路径名 $LANG locale $LC_ALL locale $TERM 终端类型,一般为xterm $EDITOR 系统默认编辑器,环境变量的设置,export name=value; bash foobar.sh name=value ./foobar.sh 更多信息请 man env 更多变量见 man bash: Shell Variables,问题,在哪设置JAVA_HOME,让所有用户皆可使用 按上面的设置后,rc.local中 执行以下命令可否成功 /usr/local/apache-tomcat/bin/start.sh,环境变量要注意的,变量需要export才能被子进程看到(成为环境变量) 大部分的环境变量在login时被设置 要注意locale对程序输入输出的影响,数值运算,运算工具 let, expr ( ) bc 常用运算 + - * / % (加,减,乘,除,取模) 更详细内容:man bash: ARITHMETIC EVALUATION,i=10; j=20; ( i+ ) ( cnt = i + j ) cnt=$( i + j ),管道与here doc,bc支持浮点数运算 但bc是交互式的, 怎么办?,bc EOF # EOF称为占位符 scale = 3 # 输入的内容 10 / 3 EOF,echo “scale = 3; 10 / 3“ | bc,流程控制,条件判断 if case 循环 for, while break, continue,if . then,if . 语句用于判断一个/一组命令是执行否成功 表达式,测试字符串,文件 ( ) 表达式,测试数值计算结果 bash命令,测试命令是否执行成功 命令的退出码( $? )为0时,代表true,字符串测试,文件测试,更详细内容 man bash CONDITIONAL EXPRESSIONS,if . else .,if expression; then elif expression; then else fi,判断OS if -f /etc/SuSE-release ; then echo SUSE OS elif -f /etc/slackware-version ; then echo Slackware OS else echo “Redhat ?” fi,命令的退出状态,检查 $? 的值是否为0, 0为真,非0为假,grep -wq admin /etc/passwd if ( $? = 0 ); then echo “found” else echo “not found” fi,if grep -wq admin /etc/passwd then echo “found” else echo “not found” fi,case,# 语法 case $var in condition1) Statments1 ; condition2) statments2 ; *) default statments ; esac,read answer case $answer in yes) echo yes ; no) echo no ; *) echo unknown ; esac,case中的字符匹配,* 匹配零个或多个任意字符 ? 匹配一个任意字符 字符组,可以匹配组中的一个字符 | A|B, A或者B,case中的字符匹配,case $answer in YyEeSs) echo “Answer is yes“ ; NnOo) echo “Answer is no“ ; *) echo unknown ; esac,case $answer in yes|y) echo “Answer is yes“ ; no|n) echo “Answer is no“ ; *) echo unknown ; esac,while循环,形式1 while expression; do statments done 形式2 until expression; do statements done,#example i=1 sum=0 while ( i = 100 ); do ( sum += i ) ( i+ ) done echo sum: $sum,统计行数,for循环,for $var in var1 var2 . do statments done break 中断循环 continue 继续循环,# example for file in $( ls -d /data* ) do if -h $file ; then echo “symlink $file” fi done,for循环,# example for QB in $( get_QB ); do buy “$QB” “狗粮” done,# example for QB in $( get_QB ); do buy “$QB” “狗粮” done # 判断 for 是否轮空 if -z $QB ; then send_sms “您的QB不足.” exit 1 fi,重定向,一个进程运行时,内核为其准备三个默认文件句柄 STDIN (0), STDOUT(1), STDERR (2),echo xxx file echo xxx 1 file read line log.err some_com /dev/null 2&1 some_com & /dev/null,块重定向-1,if $error ; then echo “error: $error” “$log” else echo “ok” “$log” fi,if $error ; then echo “error: $error” else echo “ok” fi “$log”,#! /bin/bash file=$0 cnt=0 while read; do ( cnt + ) echo -e “$cnt:t$REPLY“ done $file.log,块重定向-2,echo message 1 “$log” echo message 2 “$log” echo message 3 “$log”, echo message 1 echo message 2 echo message 3 “$log”,( echo message 1 echo message 2 echo message 3 ) “$log”,函数,调用: 需要先定义后调用。名字参数 参数: $1, $2 . $#, $ 返回值: 标准输出 退出状态: return $num;或最后一个命令的退出状态 注意 函数必须先定义,后使用,函数,# define func_name() local可指定局部变量,# example add() local sum ( sum = $1 + $2 ) echo $sum cnt=$( add 10 20 ),判断OS,# V1 is_suseos() if -f /etc/SuSE-release then return 0 else return 1 fi ,# V2 is_suseos() -f /etc/SuSE-release 最后一个命令的$?,# 调用 if is_suseos; then echo “SUSE OS” else echo “Slackware ?” fi,关于函数的建议,函数名要具可读性,从名字即能看出功能 函数尽量精练,只完成单一功能 尽量使用局部变量 ( local val ) 尽量在$?中返回失败/成功 调用函数时要检查成功与否 一般不需要编写main(),内容导航,Bash基础 Bash语法 监控实例 ,监控实例,进程监控 crontab调度 独立运行,周期性检查 例: cron_mon.sh, 一个脚本的成长过程,关于脚本的建议

温馨提示

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

评论

0/150

提交评论