bash shell基础编程
一. BASH Shell编程基础 1. BASH Shell的可执行文件 (1) 内部命令 (2) 外部命令 (3) 脚本文件 2. BASH Shell的命令解释过程 在path指定范围内查找(外部命令) ...... 3. BASH Shell的变量 (1) 变量的分类 -按作用域分 a. 局部变量 b. 全局变量 -按用途分 a. 自定义变量 b. 系统环境变量(path) c. 特殊变量 (2) 定义和引用变量 -定义变量: 即用即定义、不用加$ 注: 可用export命令将变量输出为全局变量 -引用变量: $变量名 -取消变量定义: unset变量名 (3) 系统环境变量 HISTSIZE 定义历史记录的大小 PATH 定义通用路径 LANG/LANGUAGE 定义默认语言 HOSTNAME 定义主机名 SHELL 定义用户的shell类型 USRENAME 登陆名 HOME 用户的家目录 PWD 当前工作目录 注: env命令可以查看当前用户环境的变量 (4) 特殊变量或预定义变量 $1-$9 代表位置参数 $0 代表命令名称 $$ 命令进程的PZD $# 命令的位置参数的个数 $* 命令的所有位置参数 4. BASH SHELL的运算符 (1) 算数运算符 + - (2) 比较运算符 -数值比较 -gt 大于 -eq 等于 -lt 小于 -ge 大于等于 -le 小于等于 -ne 不等于 -字符串比较 = 等于 != 不等于 -z 判断字符串是否为空 (3) 逻辑运算符 -a 与 -o 或 ! 非 (4) 文件判定运算符 -e 判断文件是否存在 -r 判断文件是否可读 -w 判断文件是否可写 -x 判断文件是否可执行 -d 判断文件是否为目录文件 -f 判断文件是否为普通文件 -c 判断文件是否为字符设备文件 -b 判断文件是否为块设备文件 5. Bash Shell中的特殊字符 (1) 文件通配符 * 所有字符 ? 任意单个字符 [..] 指定范围内的字符 [^/!..] 指定非范围内的字符 {字符,...n} 指定集合内的字符 (2) 替换符 -$ 引用变量 -${变量名} 引用指定变量的值 -`命令` 引用指定命令的结果 -$(命令) 引用指定命令的结果 -$(( 算术表达式 )) 引用指定表达式的值 (3) 其它特殊字符 -'字符' 表示字符串,关闭所有引用,引用所有被括起来的字符 -"字符" 表示字符串,引用所有除$和``以外的字符 -字符 转义字符 6. BASH Shell提供的内部命令 (1) echo 作用: 显示指定内容 格式: echo [参数] 字符串/表达式 实例: #echo "linuxsystem" #echo -n"unix:" #echo -n"china:" -n 不换行输出 (2) read 作用: 从键盘给指定变量赋值 格式: read 变量名 实例: #read a (3) test 作用: 判断表达式结果是否为真 格式: test 表达式 实例: #test$USER="root" && echo "current user isadministrator" #test -x/usr/sbin/useradd && /usr/sbin/useradd u3 注: 可用[ 表达式 ]来替换test命令 ?Cx 文件存在并且可执行 (4) if 作用: 实现条件分支 格式: if 表达式/命令; then ... 命令 ... [else ... 命令 ... ] fi 实例: #if [`id-u`="0"];then echo "current user is root";else echo"current user is not root";fi (5) case 作用: 实现多种条件分支 格式: case 变量 in 值1) ... 命令 ;; 值2) ... 命令 ;; 值3) ... 命令 ;; .... *) ... ;; esac 实例: #vi /script/sh1 #!/bin/bash echo -n"Input:" read a case $ain off) poweroff ;; windows) init 5 ;; reboot) reboot ;; *) echo"please input off/windows/reboot" ;; esac (6) for 作用: 实现循环执行命令行 格式: for 变量名 [in 字符串] do ... 命令行 ... done 实例: #for i in"/etc/*";do echo $i;done//遍历etc下文件 (7) while 作用: 实现循环执行命令行 格式: while 表达式/命令行 do ... 命令 ... done 实例: #vi /script/sh3 #!/bin/bash a=1 s=0 while [$a -le 10 ] do s=$(($s+$a )) a=$(($a+1 )) done echo $s (8) exit 作用: 退出程序 格式: exit (9) break/continue 作用: break 退出循环 continue 进入下一次循环 格式: break continue (10) function 作用: 自定义函数 格式: function 函数名() { ... 函数体 ... } 函数名 6. 执行Bash脚本 (1) 方法一 设置脚本文件允许用户具有执行权限,然后用户可输入脚本的路径即可执行 #./5.sh (2) 方法二 #bash 脚本路径 7. 实例: 请编写shell脚本,完成以下功能: (1)shell脚本运行时会在屏幕上显示以下画面 ********************************************* * Main Menu * * 1. poweroff * * 2. start iptables * * 3. create user * * 4. exit * ********************************************* (2) 按菜单项前的数字可实现相应的功能 #vi menu.sh #functionmu() #{clear echo"*********************************************" echo"* Main Menu *" echo"* 1. poweroff *" echo"* 2. start iptables *" echo"* 3. create user *" echo"* 4. exit *" echo"*********************************************" #} #functionft() echo -n"please input:" read f case $fin 1) poweroff ;; 2) startiptables ;; 3) echo -n"useradde" read u useradd$u passwd $u ;; 4) exit ;; *) echo"please input 1/2/3" ;; esac mu ft #chmodu+x menu.sh 二. 文本过滤命令 1. head 作用: 显示指定文件的前n行内容 格式: head [-数字] 文本文件 实例: #head -3/etc/passwd 2. tail 作用: 显示指定文件的未尾n行内容 格式: tail -n/+n/-f 文本文件 -f参数,会实时的监视某程序 实例: #tail -3/etc/passwd #tail +3/etc/passwd #tail -f/var/log/message 3. uniq 作用: 检查及删除文本文件中的重复行 格式: uniq [参数] 文本文件 实例: #uniq /abc/f1 #unisq-d /abc/f1 -d:只输出重复的行 4. sort 作用: 对指定文本内容排序显示 实例: #sort /etc/f1 #sort-t: +2 -3 -n /etc/passwd #sort -r/abc/f2 -n 数字大小排序 -r 反向排序 -t:+2 从第二列开始排 5. grep 作用: 从文本文件中提取符合条件的行 格式: grep [参数] "匹配字符串" 文本文件 实例: #grep"root" /etc/passwd #grep -c"root" /etc/passwd #grep -q"root" /etc/passwd #grep -v"root" /etc/passwd #grep"^root:" /etc/passwd -v 反向匹配 -w 完整匹配 -i 忽略大小写 -c 只显示符号要求的几行 -q quiet 安静模式 6. sed 作用: sed是一种基于命令行的非交互式文本编辑器 格式: sed [参数] 子命令 文本文件 实例: -输出内容: p子命令 #sed -n'/root/p' /etc/passwd //显示有root行的内容 #sed -n'3p' /etc/passwd //显示第三行内容 #sed -n'3,10p' /etc/passwd //显示3到10行内容 #sed -n'10,$p' /etc/passwd //显示10行到最后一行的内容 -删除内容: d子命令 #sed'/root/d' /etc/passwd //删除有root的行 #sed'4d' /etc/passwd //删除第四行 #sed '4,8d'/etc/passwd //删除4到8行的内容 -替换内容: s子命令 #sed's/root/admin/g' /etc/passwd //把root替换成admin #sed -n's/root/admin/gp' /etc/passwd //把root替换成admin -读取指定文件内容: r子命令 #sed '4r/abc/f1' /abc/f2 #sed '$r/etc/shadow' /etc/passwd //passwd要读取的文件 -将符合条件的行写入文件: w子命令 #sed -n'3,10w /abc/f3' /etc/passwd //读取/etc/passwd文件第三行到第十行写入文件/abc/f3 -向文件添加内容: a子命令 #sed'3alinux system' /abc/f1 //第三行后面加上linux system #sed'/root/aunix' /abc/f1 //有root的行后面加下unix -向文件插入内容: i子命令 #sed'3ilinux' /abc/f1 //向文件第三行插入linux字符串(新行) -多次编辑: -e 参数 #sed -e'1,10d' -e 's/root/admin/g' /abc/f1 -n:使用安静(silent)模式:匹配到的就显示出来。反之不显示 三. awk 1. 什么是awk awk是一种具有编程功能非交互式编辑器,可用于提取、修改文本内容 2. awk的使用方法 方法一: #awk [参数] '{awk程序}' 文本文件 方法二: #awk [参数] -f 脚本文件 文本文件 方法三: #awk 脚本文件 文本文件 [-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量var=value 3. 认识文本文件的记录和字段 (1) 以特定记录分隔符结束的内容称之为记录,默认记录分隔符为换行符,可用$0引用整个记录 (2) 每个记录中由特定字符分隔的内容称之为字段,默认字段分隔符为空格,可用$1-$n引用字段 ipadd 192.168.16.99mask 255.255.255.0 //一行为记录、ipadd为记录中的字段 4. awk提供的运算符、函数和变量 (1) awk的运算符 -算术运算符: + - */ %(取余) ^(乘方) -关系运算符: <> <= >= == != ~(匹配) !~(不匹配) -逻辑运算符:&& || ! -赋值运算符: = +=-= *= /= %= ^= -自增、自减运算符: ++-- -数组引用: in
(2) awk的变量 -自定义变量 awk变量分为数值型和字符型,用户引用变量时即定义了变量,变量类型由变量内容决定,引用变量时不用加$ -内置变量 FS 字段分隔符(默认是任何空格) RS 记录分隔符(默认是一个换行符) NF 当前记录中的字段数 NR 当前记录数 OFS 输出字段分隔符(默认值是一个空格) ORS 输出记录分隔符(默认值是一个换行符) (3) awk的函数 -字符串函数 length(string) 求串string中的字符个数 substr(string,position,len) 返回一个以position开始len个字符的子串 tolower(string) 转换为小写字符 toupper(string) 转换为大写字符 match(string,reg) 返回正规表达式reg匹配的string中的位置 sub(reg,targetstring) 第一次当正规表达式reg匹配,替换target串中的字符串 index(search,string) 返回string中search串的位置 -时间日期函数 systime() 返回当前系统日期和时间 strftime(格式符,日期时间) 返回格式化后的日期和时间,strftime常用的格式符 %a 星期几的缩写(Sun) %A 星期几的完整写法(Sunday) %b 月名的缩写(Oct) %B 月名的完整写法(October) %c 本地日期和时间 %d 十进制日期 %D 日期 08/20/99 %H 用十进制表示24小时格式的小时 %I 用十进制表示12小时格式的小时 %m 十进制表示的月份 %M 十进制表示的分钟 %S 十进制表示的秒 %y 两位数字表示的年(99) %Y 四位数字表示的年(9999) -数学函数 int(x) 取整 rand() 随机数 sqrt(x) 平方根 5. awk的常用语句 (1) print 作用: 输出指定的字符串或表达式的值 格式: print 字符串/表达式 实例: #awk -F: '{print$1}' /etc/passwd (2) printf 作用: 格式化输出指定字符串或表达式的值 格式: printf "格式符/字符串",表达式/变量 实例: #awk -F: '{printf"username:%sn",$1}' /etc/passwd -转义字符 t table制表位 n 换行符 表示“” b 表示退格 -格式符 %c 输出单个字符 %d%i 输出整数 %e 按科学计数法输出小数 %f 输出浮点数 %s 输出字符串 %% 输出% (3) if 作用: 实现条件分支 格式: if(条件表达式) { ... } [else { ... }] 实例: #awk -F:'{if($3==0) {print $0}}' /etc/passwd (4) for 作用: 实现循环执行 格式:for(init_cntr;test_cntr;incr_cntr) { ... } 实例: #awk -F:'{for(i=1;i<5;i++) {printf "%s:",$i} print n}'/etc/passwd #awk -F:'{for(i=0;i<6;i++) {printf "%s:n",$i} }' /etc/passwd (5) while 作用: 实现循环执行 格式: while(条件表达式) { ... } 实例: #awk -F:'{i=1;while(i<5) {printf "%s:",$i} print n}'/etc/passwd (6) BEGIN 作用: 定义awk在打开文件之前所执行的操作 格式: BEGIN{ ... } (7) END 作用: 定义awk在处理文件结束后所执行的操作 格式: END{ ... } (8) exit 作用: 退出awk程序 (9) break 作用: 退出循环 (10) continue 作用: 继续下一次循环 (11) next 作用: 读下一条记录 (12) getline 作用: 读取一行内容 格式: getline [<文件名|变量名] (13) close 作用: 关闭文件 格式: close(变量名/文件名) 5. awk的使用实例 (1) 编写shell脚本和awk脚本用于格式化输出指定网络接口的MAC地址、IP地址和子网络掩码 #vi/shell/ak1 #!/bin/awk-f BEGIN{ print" Mac&IP Address " print"----------------------------------------"} { if(NR==1){ printf"Mac Address:%sn",$5} if(NR==2){ printf"IP Address:%sn",substr($2,6) printf"Net Mask:%sn",substr($4,6)} } END{ print"----------------------------------------"} #chmoda+x /shell/ak1 #vi/shell/sh1 #!/bin/bash clear echo -n"input device name:" read i ififconfig|grep -q "$i" then ifconfig$i|/shell/ak1 else echo"$i is not active" fi #chmoda+x /shell/sh1 (2) 编写shell和awk脚本,统计apache指定日期的IP访问量() #vi/shell/ak2 #!/bin/awk-f BEGIN{ printf"date:" getlined<"-" //d为变量} { if(substr($4,2,11)=d){ print $1} } #vi/shell/sh2 #!/bin/bash /shell/ak2/var/log/httpd/access_log|sort|uniq|wc -l //取得日志行数 #chmoda+x /shell/ak2 #chmoda+x /shell/sh2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |