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)
上一篇 2016-08-15 09:24
下一篇 2016-08-15 09:25

相关推荐

  • vim的总结、练习和周期性任务

    vim:VI的增强版,是一款可视化功能非常强大的文本编辑器,属于全屏编辑器。 vim:使用方法: 命令格式:    ~]#vim [options] [file ..]      选项:        +#:打开文件后,直接让光标处于第#行首;   …

    Linux干货 2017-08-14
  • 第九周作业

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别统计这两类用户的个数;通过字符串比较来实现;    #!/bin/bash     echo "可登录类型有有$(awk -F: '/[^\<nologin\&gt…

    Linux干货 2017-02-07
  • 函数定义、使用

        1、函数介绍         函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程。           &nb…

    Linux干货 2016-08-22
  • Linux 文本编辑器三剑客之 sed

    参考手册: http://www.gnu.org/software/sed/manual/sed.html 转载请注明:马哥教育!!

    Linux干货 2017-01-12
  • linux内核及centos系统启动流程

    Linux组成 Linux: kernel+rootfs(根文件系统) kernel功能: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能 rootfs:程序和glibc  库:函数集合, function, 调用接口(头文件负责描述)      过程调用:proce…

    Linux干货 2016-09-10
  • LAMP编译安装

    所谓的LAMP是指构建在Linux之上经典的一种web架构方式,其中L指的是Linux,A指的是Apache的httpd,M指的是Mysql或MariaDB,P指的是PHP,这种组合方式的基本工作模式是有httpd负责接收和相应用户的请求,然后将需要处理的php页面交由后端的php应用程序处理,而php应用程序处理php页面时的数据存储在Mysql数据库中,…

    Linux干货 2016-12-19

评论列表(1条)

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

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