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

相关推荐

  • Bash的基础特性(二)

    Bash的基础特性(二) glob文件通配符 (* ; ? ; [ ] ; [^ ] ) 星号* 匹配任意所有字符的 [root@lyp ~]# ls h* hello.sh hello.shbak ?匹配单个字符 ls ???? 查看四个字符命名的文件 [0-9]匹配数字 [a-z] 字母 字母的顺序安装 a A b B c C… z Z 匹配的a-z […

    Linux干货 2017-04-01
  • Linux进程管理和性能监控

    概述     监控系统的各方面的性能,保障各类服务的有序运行,是运维工作的重要组成部分,本篇就介绍一些常用的系统监控命令和相关参数的说明     具体包含以下几个部分:         1、进程管理基…

    Linux干货 2016-09-07
  • 你的数据根本不够大,别老扯什么Hadoop了

    本文原名“Don’t use Hadoop when your data isn’t that big ”,出自有着多年从业经验的数据科学家Chris Stucchio,纽约大学柯朗研究所博士后,搞过高频交易平台,当过创业公司的CTO,更习惯称自己为统计学者。对了,他现在自己创业,提供数据分析、推荐优化咨询服务,他的邮件是:stucchio@gmail.co…

    Linux干货 2015-04-04
  • 笔记三、如何在VMWare Workstation中安装CentOS 7

    一、准备工作     1.1 安装VMWare WorkStatrion     1.2 准备好CentOS 7 镜像包     http://www.centoscn.com/CentosSoft/iso/    CenOS7下载地址 二…

    2017-02-23
  • quota AND raid

    1.磁盘配额 将home目录独立出来单独的分区,限制用户的使用。 (1)先创建分区,如下图的分区sda6 (2)命令同步系统的新增加分区:partx –a /dev/sda (3)命令格式化新分区:     (4)把创建的设备挂载到/mnt/home下    (5)迁移数据,移动之前要确保home分区没有使用。权限是保…

    Linux干货 2016-09-19
  • OpenStack私有云部署

    前言 相信你一定对“云主机”一词并不陌生吧,通过在Web页面选择所需主机配置,即可快速定制一台属于自己的虚拟主机,并实现登陆操作,大大节省了物理资源。但这一过程是如何实现的呢?本文带来OpenStack Icehouse私有云实战部署。 OpenStack 简介 OpenStack是由网络主机服务商Rackspace和美国宇航局联合推出的一个开源项目,Ope…

    2016-12-19

评论列表(1条)

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

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