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

相关推荐

  • 浅述sed命令

    1、sed工作原理       sed(stream editor)是一种流编辑器,本身也是一个管道命令,可以分析编辑标准输入(standard input),包括对数据进行替换、删除、新增、选取特定行等等。运行时以行为单位,每次只处理一行的内容,因此它又被称为行编辑器。sed还可与正则表达式配合使用,从而简…

    Linux干货 2016-08-10
  • 用户和组相关配置文件

    1. /etc/passwd文件详解 输入vi /etc/passwd 可以查看此文件的内容 [root@localhost ~]# vi /etc/passwdroot:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/…

    Linux干货 2016-10-23
  • Python装饰器与面向切面编程

    新年好~ 那么,很久没有更新了,其实想想也没多少可以写的,因为Python的文档似乎很全面的说……能做的差不多只有翻译和整理了,英文过关的朋友不妨直接去doc.python.org这里查看相关资料 :) 转载请注明原作者和原文地址,多谢! 今天来讨论一下装饰器。装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理…

    Linux干货 2015-03-12
  • Hadoop集群配置

    通常,集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode也作为TaskTracker。这些机器是slaves\ 官方地址:(http://hadoop.apache.org/common/docs/r0.19.2/cn/cluster_setup.ht…

    Linux干货 2015-06-03
  • LAMP架构实验1

    LAMP架构实验 — 基础架构搭建 实验实验拓扑图与目的 实验过程 总结与问题 实验实验拓扑图与目的 1. 实验主框架LAMP采用编译安装。 2. 分离HTTPD,PHP,MARIADB。 3. 两台服务器能够各自被访问且内容相同。 实验过程 程序包准备: apr-1.5.2.tar.gz          …

    Linux干货 2016-05-10
  • Linux基本操作:关机 重启

        Linux系统安装完成以后,就要学会一些Linux的基本操作命令,首先是关机和重启命令,如果进入Linux系统之后连关机重启都不会是不是太不应该了,总不能关机或重启的时候直接关闭电源在开机吧,这就显得太不专业了,这样也会对Linux系统主机不太好,一些进程还没有关闭就直接断电,会导致Linux系统的不稳定出现问题,何况也…

    Linux干货 2016-08-04

评论列表(1条)

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

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