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命令

–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‘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‘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‘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.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(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:%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($2,6)

printf"Net Mask:%s\n",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

时间: 2024-10-16 15:51:15

bash shell基础编程的相关文章

8.11_Linux之bash shell脚本编程入门篇(一)

什么是bash shell脚本编程? 答:Linux里面有多种shell,而CentOS和redhat的默认shell是bash shell.至于shell脚本,这个跟windows操作系统里面的批处理文件有点像(.bat的文件).不知道大家还是否记得Linux的哲学思想吗?其中有那么两点点:由众多目的的单一应用程序组成:一个程序只做一件事,且做好:组合目的的单一的小程序完成复杂的任务.我觉得shell脚本编程就很好的体现了这个哲学思想.shell脚本利用shell的功能缩写的一个"程序&quo

Bash Shell脚本编程笔记总结(二)

本文接上一部分:Bash Shell脚本编程笔记总结(一) 数组: 连续的多个独立内存空间,每个内存空间相当于一个变量 数组元素:数组名+索引 索引:从0开始编号 声明数组: declare -a ARRAR_NAME 关联数组: declare -A ARRAY_NAME 支持稀疏格式: 数组元素的赋值: (1) 一次只赋值一个元素 ARRAY[index]=VALUE a[0]="hello" (2) 一次赋值全部元素 ARRAY=("mon" "tu

bash shell基础特性之三(数组)

bash shell基础特性之三(数组) 一.数组定义 数组指连续的多个独立内存空间,每个内存空间相当于一个变量. bash shell只支持一维数组,但参数个数没有限制. 数组元素:数组名+索引(从0开始编号) 声明数组:declare -a ARRAR_NAME(其实不用声明,按数组方式直接赋值给变量即可,BASH就知道那是数组) 关联数组:declare -A ARRAY_NAME 数组元素的赋值:一次赋值全部元素.指定索引进行赋值.一次只赋值一个元素 (1) array=(var1 va

Bash Shell脚本编程笔记总结(一)

本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程: 编程环境: 流程控制语句: 顺序执行: 循环执行: 选择执行: 条件测试:真.假 $? 命令的状态结果: 0: 真 1-255: 假 过程式的编程语言的元素:变量.流程.函数.数组 变量:局部变量.本地变量.环境变量.位置参数变量.特殊变量 变量: 数值

8.15_Linux之bash shell脚本编程入门篇(二)以及文件查找和压缩的使用

bash shell脚本编程入门篇(二) read命令的使用 作用: 使用read来把输入值分配给一个或多个shell变量: -p指定要显示的提示 -t TIMEOUT read从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量 EX.read -p "Enter a filename:" FILE 条件选择之if的使用 if的作用:选择执行(注意:if语句可嵌套) 单分支 if 判断条件;then 条件为真的分支代码 fi EX.单分支案例 双分支 if

8.17_Linux之bash shell脚本编程入门篇(三)之循环以及函数function的使用

bash shell脚本编程入门篇(三)之循环 什么是循环执行? 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 相关命令:for, while, until,selet, for命令的使用 作用: 依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束 命令格式: for 变量名 in 列表; do 循环体(正常执行的执行命令) 语句1 语句2 语句3 ... done 列表生成方式: (

在Bash shell脚本编程中,如何正确无误获取到“脚本选项参数”和“脚本参数”呢?

Linnux 中有些命令的功能非常强大,主要是因为它支持的命令选项比较多.如:[ip]命令可以配置IP地址.路由条目的配置管理操作非常完善,该命令就可以完成[ifconfig]和[route]命令实现的所有功能.函数是单独的功能模块,如果函数能够接收选项参数,那么该函数的功能就变得丰富,且灵活.脚本也是一样. 那么linux中命令的格式又是怎么样的呢? [[email protected] ~]# command   [optons parameter1 | parameter2]...  pa

Bash Shell脚本编程-基础特性知识

Bash Shell的基础特性: 命令历史: history:shell内建命令 环境变量HISTFILE定义用户退出命令历史列表的存储位置 #echo $HISTFILE /root/.bash_history # echo $HISTFILESIZE   HISTFILE指向的文件持久留存的历史命令条目 1000 # echo $HISTSIZE           当前bash进程所留存的历史命令条目数 1000 # history -d 123            删除历史列表中的第1

bash shell基础语法

本文主要是基础的基础,希望对大家有所帮助 一.Shell基本类型的变量: (1)Shell定义的环境变量: Shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,用户还可以重新定义这些变量,常用的Shell环境变量有: HOME 用于保存注册目录的完全路径名. PATH 用于保存用冒号分隔的目录路径名,Shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行. TERM 终端的类型. UID 当前用户的识别字,取值是由数位构成的字串. PWD