《《bash脚本编程基础》ppt课件》由会员分享,可在线阅读,更多相关《《bash脚本编程基础》ppt课件(53页珍藏版)》请在金锄头文库上搜索。
1、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_
2、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,
3、为了统一管理,在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 ex
4、pansion(花括号扩展) 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 ) S
5、um=$( 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中配置
6、,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=$
7、( 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 ?,环境变量,环境变量是
8、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/ap
9、ache-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称为占位符 sc
10、ale = 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 ex
11、pression; 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 th
12、en 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中的字符匹配,ca
13、se $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
14、 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,# exam
15、ple 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 “$l