码迷,mamicode.com
首页 > 系统相关 > 详细

bash shell基础编程

时间:2017-09-16 11:53:21      阅读:210      评论:0      收藏:0      [点我收藏+]

标签: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命令

x     文件存在并且可执行

 

(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‘310p‘ /etc/passwd  //显示310行内容

#sed -n‘10$p‘ /etc/passwd  //显示10行到最后一行的内容

 

-删除内容: d子命令

#sed‘/root/d‘ /etc/passwd //删除有root的行

#sed‘4d‘ /etc/passwd  //删除第四行

#sed ‘48d‘/etc/passwd  //删除48行的内容

 

-替换内容: 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‘310w  /abc/f3‘ /etc/passwd //读取/etc/passwd文件第三行到第十行写入文件/abc/f3

 

-向文件添加内容: a子命令

#sed‘3a\linux system‘ /abc/f1 //第三行后面加上linux system

#sed‘/root/a\unix‘ /abc/f1 //root的行后面加下unix

 

-向文件插入内容: i子命令

#sed‘3i\linux‘ /abc/f1  //向文件第三行插入linux字符串(新行)

 

-多次编辑: -e 参数

#sed -e‘110d‘ -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.99 mask 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(stringpositionlen)  返回一个以position开始len个字符的子串

tolower(string)              转换为小写字符

toupper(string)              转换为大写字符

match(stringreg)            返回正规表达式reg匹配的string中的位置

sub(regtargetstring)       第一次当正规表达式reg匹配,替换target串中的字符串

index(searchstring)         返回stringsearch串的位置

 

-时间日期函数

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:%s\n"$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:%s\n"$5}

if(NR==2){

printf"IP Address:%s\n"substr($26)

printf"Net Mask:%s\n"substr($46)}

}

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) 编写shellawk脚本,统计apache指定日期的IP访问量()

#vi/shell/ak2

#!/bin/awk-f

BEGIN{

printf"date:"

getlined<"-"    //d为变量}

{

if(substr($4211)=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


本文出自 “Linux狱长” 博客,请务必保留此出处http://sswqzx.blog.51cto.com/2494644/1965778

bash shell基础编程

标签:shell

原文地址:http://sswqzx.blog.51cto.com/2494644/1965778

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!