bash shell基础编程

前端之家收集整理的这篇文章主要介绍了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'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.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(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

猜你在找的Bash相关文章