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

相关推荐

  • http协议

    ##socket套接字– 套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换。– socketAPI:封装了内核中所提供的socket通信相关的系统调用– socketDomain:根据其所使用的地址– AF_INET:Address Family,Ipv4&#8…

    Linux干货 2017-12-06
  • Linux简介和基础

    一、系统和硬件 无论是Linux、OS X、Windows操作系统,他们都是由以下部分组成(分层结构): 最底层:硬件 底层之上:将硬件的接口抽象成为系统调用(kernel) 再之上:库 再此之上为:应用程序 程序的运行可以有两种方式: 1、开机自动启动运行 2、用户通过交互式接口登陆或者连接系统上去,来手动运行程序 二、终端: 1、物理终端:我们可以将显示…

    Linux干货 2017-09-02
  • 计算机之路及初识linux

    写在前面:     很抱歉,上周的事儿,拖到这周,也是个半成品,加班就不多说了,每个人都很忙,总要自己找时间。本计划这个周末好好补补,无奈身不由己,刚刚回来。    还好昨夜先起了个初稿,总算是有些东西可以交代给自己,想到马哥说的,完成远比完善重要,虽然来不及完善,先发出来吧,有了框架,至少知道自己做过什么。尽快排版吧…

    Linux干货 2016-12-05
  • 命令行历史和调用命令参数

    history显示当前终端的历史记录 !! 重复执行上一条命令 !-n 重复执行倒数第n条命令 !n 重复执行第n条命令 ctrl+p 等于向上方向键,翻出上一条命令。 ctrl+n 等于向下方向键,翻出下一条命令。 ctrl+j 等于enter 执行当前命令 !:0 执行前一条命令(去除参数) !string 重复前一个以“string”开头的命令(只限于…

    2017-07-14
  • 马哥教育网络班20期+第4周课程练习

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [root@localhost ~]# cp -r /etc/skel/ /home/tuser1 [root@localhost ~]# chmod&n…

    Linux干货 2016-07-04
  • Memcached实现Tomcat的session会话绑定

    memcached介绍:  Memcached是一个高性能的分布式内存对称缓存系统;通过缓存查询数据库结果,介绍数据库访问次数,以提高web应用的速度、提高扩展性。  Memcached特点:   协议简单   基于libevent的事件处理   内置内存存储方式  memcached不互相通信的分…

    Linux干货 2015-08-01

评论列表(1条)

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

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