shell脚本编程初步

shell脚本编程初步

   随着课程学习的深入,我们已经学习了一些常用的命令,会去解决了一部分简单的问题,但是这不能满足复杂的工作,它可以帮助我执行自动化的常用命令、执行系统管理和故障排除、创建简单的应用程序、处理文本或文件。所以我们开始了shell脚本的编程,帮助我们更好的去完成工作。简单地说,shell编程相当于帮我们之前学习的许多命令进行了深度的结合。

一、shell脚本基础界面

  shell脚本是包含一些命令或声明,并符合一定格式的文本

格式要求:首行shebang机制

 如:#!/bin/bash

     #!/usr/bin/python

     #!/usr/bin/perl

我们打开一个脚本查看一下,例如打开/root/bin/AandB.sh

图片1.png 

1行:定义shebang机制(一般必须有);

2行:为本脚本添加的备注与相关描述(可有可无,建议养成好的习惯);

3行:命令行的书写,可以书写多行。但是要代码数量尽量简洁。

二、脚本的调试命令

  我们可以通过使用bash -n /path/to/some_script去检测脚本中的语法错误。还可以通过bash -x /path/to/some_script进行调试执行。

三、脚本中的几种变量

  1、本地变量

(1)变量的赋值:

name=value;echo $name 可以显示出value

 value可以是直接字串; name=root"

 value变量引用:name="$USER"

 value命令引用:name=` COMMAND `, name =$(COMMAND)

(2)生效范围:当前shell进程;

  无效范围: 对当前shell 之外的其它shell 进程,包括当前shell 的子shell 进程均无效。

(3)变量的定义与删除

显示定义的所有变量:set.

删除变量:unset name

由于定义的变量会占用服务器的内存,所以使用完一个变量后要及时删除。

  2、环境变量:

1)生效范围:当前shell进程及其子进程。

2)变量声明:

 export name =VALUE

 declare -x name =VALUE

(3)变量引用:$name, ${name}

(4) 显示所有环境变量:

export

env

printenv

删除:unset name

(5)bash 有许多内建的环境变量:PATH, SHELL, USRE,UID,

HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1    

  3、局部变量:

   当前shell进程中某代码片段(通常指函数)

  4、位置变量:

   $1,$2,…来表示,用于用于让脚本在脚本代码中调用通过命令行传递给它的参数

  5、特殊变量:

   $0:命令本身

   $*:传递给脚本的所有参数,全部参数合为一个字符串

   $@:传递给脚本的所有参数,每个参数为独立字符串

   $#: 传递给脚本的参数的个数

四、bash 中的算术运算:

+, -, *, /, % 取模(取余), ** (乘方)

实现算术运算:

(1) let var= 算术表达式

(2) var=$[ 算术表达式]

(3) var=$(( 算术表达式))

(4) var=$(expr arg1 arg2 arg3 …)

(5) declare i  var =  数值

(6) echo ‘ 算术表达式’ | bc

乘法符号有些场景中需要转义 ,如 如*

 bash 有内建的随机数生成器:$RANDOM 1-32767

echo $[$RANDOM%50]  0-49 之间随机数

赋值

增强型赋值:+=, -=, *=, /=, %=

例如:let count+=3

自加3 后自赋值

自增,自减:

let var+=1

let var++

let var-=1

let var–

五、一些命令的复习

1、显示磁盘分区情况

图片2.png 

2、使用export查看环境变量

图片3.png 

 

3、在脚本代码中调用通过命令行传递给脚本的参数

vim  /root/bin/arg.sh 编辑命令如下

图片4.png 

然后将参数传给这个可执行的文件

图片5.png 

图片6.png 

                         0810课题练习作业

1、编写脚本/root/bin/systeminfo.sh, 显示当前主机系统信息,包括主机名,IPv4 地址,操作系统版本,内核版本,CPU 型号,内存大小,硬盘大小。

答:先把每条命令写出来,然后再写入脚本之中。

显示主机名:hostname

IPv4地址:ifconfig|sed -n "2p"|tr -s " " ":"|cut -d: -f3

操作系统版本:cat /etc/system-release

内核版本:uname   -r

cpu型号:lscpu|grep "Model name"|cut -d: -f2|sed -r 's@^[[:space:]]{2,}\b@@'

内存大小:free -m|sed -n "2p"|tr -s " " ":"|cut -d: -f2

硬盘大小:fdisk -l|grep "sda\b"|cut -d, -f1|cut -d: -f2

然后在脚本中进行编辑

1图片7.png 

显示结果如下:

图片7.png 

2 、编写脚本/root/bin/backup.sh ,可实现每日将/etc/ 目录

备份到/root/etcYYYY-mm-dd中。

答: cp  -a  /etc/  /root/ etc`date +%F`

图片8.png 

3 、编写脚本/root/bin/disk.sh, 显示当前硬盘分区中空间利

用率最大的值

答:df |grep "sd"|sort -n|head -n 1|tr -s " " ":"|cut -d: -f5

图片9.png 

图片10.png 

4 、编写脚本/root/bin/links.sh, 显示正连接本主机的每个远

程主机的IPv4

答:netstat -nt|tr -s " " ":"|cut -d: -f6|grep "[0-9]"

图片11.png 

图片12.png 

5、写一个脚本/root/bin/sumid.sh ,计算/etc/passwd

文件中的第10 个用户和第20 用户的ID 之和。

答:先想好如何提取第10个和第20个用户的ID号。

之后编辑如下的脚本

图片13.png 

6、写一个脚本/root/bin/sumspace.sh ,传递两个文件

路径作为参数给脚本,计算这两个文件中所有空白行之和。

答:本题涉及传参数和查找文件空白行。两步完成组合即可得到想要结果。

答:在vim编辑脚本要注意针对命令,应该使用`,反向单引号。避免使用双引号出现错误。

图片14.png 

之后在执行命令是传入参数即可。

图片15.png 

7、写一个脚本/root/bin/sumfile.sh, 统计/etc, /var,

/usr目录中共有多少个一级子目录和文件

答:首先,要做好每个目录中的目录和文件的数量统计,之后编辑文本并传入参数即可。这样比较灵活,注意脚本编辑尽量具有通用性,不要”写死了“。

图片16.png 

图片17.png  

8 、写一个脚本/root/bin/argsnum.sh ,接受一个文件路径作

为参数;如果参数个数小于1 ,则提示用户“至少应该给一个

参数”,并立即退出;如果参数个数不小于1 ,则显示第一个

参数所指向的文件中的空白行数.

答:给定参数,利用比较命令做判断

图片18.png 

图片19.png 

9写一个脚本/root/bin/hostping.sh ,接受一个主机的

IPv4 地址做为参数,测试是否可连通。如果能ping 通,则提

示用户“该IP 地址可访问” ;如果不可ping 通,则提示用户“

该 该IP 地址不可访问”

答:

图片20.png

图片21.png 

10、判断硬盘的每个分区空间和inode的利用率是否大于80,如果是,发邮件通知root磁盘满。

答:为了简化代码,我将inode和磁盘分区的大小全部显示,当某一数值大于规定值即可发出邮件。

diskorinode=`df|(df;df -i)|grep "sda"|tr -s " " ":" |cut -d: -f5|grep -o "[[:digit:]]\+"|sort -nr|head -n 1`

[ "$diskorinode" -ge 70 ] && echo "the systems disk or inode run out pls check" | mail -s "Waring" root

图片22.png 

如下为邮件的详情

图片23.png 

11、指定文件做为参数,判断文件是否为.sh后缀,如果是,添加x权限。

答:通过对基名的判断来确认是否是符合条件的文件。

图片24.png

12、判断输入的IP是否为合法IP

答:#!/bin/bash

read -p "pls input one ipaddress:" ipadr

echo $ipadr|grep -E "^(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>$"     &> /dev/null && echo " this is a legal IP" || echo "this is not a legal IP"

图片25.png                                     

13、计算1+2+3+…+100

答:

图片26.png 

图片27.png 

14、输入起始值A和最后值B,计算从A+A+1…+(B-1)+B的总和

答:seq -s +1 100|bc

图片28.png 

 

 

原创文章,作者:178babyhanggege,如若转载,请注明出处:http://www.178linux.com/34922

(0)
178babyhanggege178babyhanggege
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • 管道:管道符;cat和more命令 重定向:文件标识符:I/O重定向符号及其用法;exec命令;代码块重定向 命令行处理:命令行处理流程;eval命令 管道: 管道是Linux编程中最常用的技术之一,Shell编程中竖杠符号:“|” command1 | command2 | command3 | … |commandn command1到commandn表…

    Linux干货 2016-08-05
  • linux进程管理

    linux系统进程查看及管理工具 对于服务器来说重要的IO 设备磁盘网络 pstree,ps,pidof,pgrep,top,htop,glances,pmap,vmstat,dstat,kill,pkill,job,bg,fg,nohup,nice,renice,killall….. pstree命令: pstree-display …

    Linux干货 2016-09-09
  • MongoDB-index

    索引:特殊的数据结构,存储表的数据的一小部分以实现快速查询 优点:     1、大大减少了服务器需要扫描的数据量     2、索引可以帮助服务器避免排序或使用临时表     3、索引可以将随机io转换为顺序io 索引评估:三星(非常好) 一…

    Linux干货 2016-11-27
  • read,locate ,find 的总结及相关联系

    read 变量名 read 变量名1 [变量名2] < 文件名不支持管道read 变量名1 [变量名2] <<< “值1 [值2] …”使用read来把输入值分配给一个或者多个shell变量     -p 指定要显示的提示     # read -p…

    Linux干货 2017-08-12
  • linux-第一周

    inux命令:(type)                  1,集成在bash中的命令,内部命令。依赖于shell类型。                  2,在文件系统路径下有…

    Linux干货 2017-05-20
  • 程序包管理的前端工具YUM及案例一二

    程序包管理前端工具–YUM        yum:yellowdog update modifier        yum工具为CS架构 yum仓库(yum repository):yum repo   &n…

    Linux干货 2016-08-24

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-15 10:07

    心态上干劲十足,学习中认真踏实,博客作业完成的还不错。