Linux 的shell脚本编程

shell脚本编程


程序:指令+数据

程序编辑风格:

            过程式:以指令为中心,数据服务于指令

            对象式:以数据为中心,指令服务于数据


shell程序:提供了编程能力,解释执行

计算机:运行二进制指令


编程语言:

         低级:汇编语言

         高级:编译:高级语言–>编译器–>目标代码

               java,c#,c,c++

               解释:高级语言–>解释器–>机器代码

               shell,per,python


编程逻辑处理方式:

          顺序执行

          循环执行

          选择执行


shell编程:

          过程式,解释执行

     编程语言的基本结构

          数据存储,变量,数组

          表达式:a+b

          语句:if


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

首行shebang机制

               #!/bin/bash

               #!/usr/bin/python

               #!/usr/bin/perl


shell脚本用途有:

         自动化常用命令

         执行系统管理和故障排除

         创建简单的应用程序

         处理文本或文件               


脚本 hello word 例子


#!/bin/bash

#autho:zczx

#Version:1.0

#Description:hello word

echo "hello,word"

:wq

chmod u+x hello.sh

/root/hello.sh


不建议在根目录PATH加入.

.bash_profile


 bash -n f1  检查语法是不是完整

 bash -x f1  调试,一条一条执行,发现出错会报错可以检查命令执行顺序


变量

变量的内容可以是更改的,内容可以存字符,存数值。不同的变量应用的范围不同,数据存储格式不同,参与的运算不同。

 

类型:字符

数值:整形,浮点型


尽量不要使用与系统指令相同的名字作为变量法则名字

1 不能使程序中的保留字

                       2 只能使用数字,字母及下划线,且不能用数字开头

           3 驼峰法则,字母首个字母开头大写

                                    4 见名知义


大写

PATH

USER

PWD

OLDPWD

HISTSIZE

HISTFIlESIZE

HISTFILESIZE

SHELL

HOME

PS1

HISTTIMEFORMAT

UID

HISTFILE                                   


bash

根据变量的生效范围等标准:


本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效

本地变量不能给子进程使用

zczx1=xxx  不能带空格

zczx1="xxx aaa bbb"   多个用'' ""来引入

echo $zczx1

echo "$zczx1" 强引用,如果变量所引用的指令跟原本指令显示的一样输出。


unset zczx1  删除变量,释放变量。


环境变量:生效范围为当前shell进程及其子进程

export +变量 声明为环境变量 

declare -x 声明为环境变量


declare -r 只读常量,不能修改,删除。只能退出脚本

readonly name 只读常量


a=xxx

b=yyy

echo ${a}b

xxxb  a是变量,b不是


局部变量:生效范围为当前shell进程中某代码片断(通常指函数)


都只针对当前终端使用


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

特殊变量:$?, $0, $*, $@, $#

$1, $2, …:对应第1、第2等参数,shift [n]换位置

$0: 命令本身

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

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

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

$@ $* 只在被双引号包起来的时候才会有差异


$*引用的参数都作为一个独立的整体 "a b c"

$@引用的参数每个数都能分为独立的字符 a b c


bash中的算术运算

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

实现算术运算:

             (1)let var =算术表达式

                  let $var*=5 

                  let $var=5 * var

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

              (3) var=[算术表达式]

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

              (5) declare –i var= 数值

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


treu | false

  1      0   

与:有0就为0.1与1为1.

或:有1就为1.0与0为0.

!1=0

!0=1

短路与 &&:第一个条件成立,就执行第二个条件。第一个条件不成立,将不执行。

短路或 ||:第一个条件成立,就不执行第二个条件,第一个条件不成立,才执行第二个条件。

异或:^

     相同为假,不同为真。


聚集命令

有两种聚集命令的方法:

  复合式:date; who | wc -l

命令会一个接一个地运行

  子shell:(date; who | wc -l ) >>/tmp/trace


进程使用退出状态来报告成功或失败

     0 代表成功,1-255代表失败

     $? 变量保存最近的命令退出状态

echo $? 查询命令是否成功执行


ping -c1 -w1 10.0.1.0 &> /dev/null

    一次  一秒

当使用了(),里面所执行的内容等于新建了一个子shell运行。    


条件性

判断某需求是否满足,需要由测试机制来实现;

专用的测试表达式需要由测试命令辅助完成测试过程;

以便用在条件性执行中

   若真,则返回0

   若假,则返回1

test 

a=haha

b=haha

test $a = $b    [$a -eq $b ] -eq是判断数字的对比

[ $a = $b ]   字符的对比

[[ $a = $b ]]


[[$1]]可以查询变量里面是否有定义


bash的测试类型

数值测试:

        -gt:是否大于:

        -ge:是否大于等于:

        -eq:是否等于:

        -ne:是否不等于

        -lt:是否小于:

        -le:是否小于等于:


==:是否等于:

>:Ascill码是否大于Ascill码

<:Ascill码是否小于Ascill码

!=:是否不等于

=~:左侧字符串是否能够被右侧的字符串所匹配,要用[[]]

-z:字符串是否为空,空为真,不空为假。[[]]

-n:字符串是否不空,不空为真,空为假。[[]]

[[-n $a]] 看是不是非0

[[-z $a]] 看是不是为0


文件测试


[-a /etc/]  查看是否存在

  存在性测试

-a FILE:同-e

-e FILE: 文件存在性测试,存在为真,否则为假;

存在性及类别测试

-b FILE:是否存在且为块设备文件;

-c FILE:是否存在且为字符设备文件;

-d FILE:是否存在且为目录文件;

-f FILE:是否存在且为普通文件;

-h FILE 或-L FILE:存在且为符号链接文件;

-p FILE:是否存在且为命名管道文件;

-S FILE:是否存在且为套接字文件;


  文件权限测试:

-r FILE:是否存在且可读

-w FILE: 是否存在且可写

-x FILE: 是否存在且可执行

 文件特殊权限测试:

-g FILE:是否存在且拥有sgid权限;

-u FILE:是否存在且拥有suid权限;

-k FILE:是否存在且拥有sticky权限;

   文件大小测试:

-s FILE: 是否存在且非空;  

-o 或者


[[ -r /tmp/file1 ]] -a [[ -w /tmp/file1]] && echo '用户对文件可读' || echo '用户对文件不可读' 

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

QQ图片20160814135141.png

QQ图片20160812145425.png

编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中

QQ图片20160814135332.png

QQ图片20160812151237.png

编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

QQ图片20160814135453.png

QQ图片20160812153702.png

编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

QQ图片20160814135624.png

QQ图片20160814135728.png

写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

QQ图片20160814135854.png

QQ图片20160812191647.png

写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

QQ图片20160814140029.png

QQ图片20160814140842.png

写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

QQ图片20160814140136.png

QQ图片20160812195454.png

写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

QQ图片20160814141017.png

QQ图片20160814141159.png

写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

QQ图片20160814112452.png

QQ图片20160814112554.png

chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写

QQ图片20160814114900.png

QQ图片20160814114925.png

编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。

QQ图片20160814125806.png

QQ图片20160814125940.png

QQ图片20160814125742.png

QQ图片20160814125916.png

写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

QQ图片20160814112452.png

QQ图片20160814112554.png

计算1+2+3+…+100的值

QQ图片20160814131818.png

QQ图片20160814142443.png

计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之

QQ图片20160814131818.png

QQ图片20160814131755.png

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

(0)
swzczxswzczx
上一篇 2016-08-15 09:24
下一篇 2016-08-15 09:24

相关推荐

  • 自动化系统安装之DHCP服务实现

    DHCP服务实现 dhcp的工作过程是基于UDP协议的,其中用到了UDP的67(服务器),68(客户端)端口 使用场景 自动化安装系统 解决IPV4资源不足的问题 同网段多dhcp服务 dhcp服务必须基于本地 先到先得 跨网段 RFC 1542 dhcpclient客户端向dhcpsercer服务器请求续约时,中间相隔多网段时,如果路由器是 RFC1542…

    2018-01-29
  • LVM 逻辑卷管理器-缩小LV容量及快照区的建立

    LVM 逻辑卷管理器-缩小LV容量 将/dev/sdb2分区抽离出来,缩小LV容量 (1)首先查看/dev/sdb2的容量大小 [root@centos6 ~]# df -h /mnt/lvm/ Filesystem        &nbs…

    Linux干货 2016-09-19
  • bash脚本与程序包管理

    概述:本章主要介绍bash编程中的函数和数组以及字符串处理和程序包管理工具等,来帮助小伙伴们更进一步的了解bash编程的内容和软件的安装、更新、卸载、查询等操作。 一、函数介绍 函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程。 它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序…

    Linux干货 2016-08-24
  • phpMyAdmin安装部署

    phpMyAdmin安装部署 phpMyAdmin 是一个用PHP编写的软件工具,可以通过web方式控制和操作MySQL数据库。通过phpMyAdmin 可以完全对数据库进行操作,例如建立、复制和删除数据等等。如果使用合适的工具,MySQL数据库的管理就会变得相当简单。应用 MySQL 命令行方式需要对 MySQL 知识非常熟悉,对SQL语言也是同样的道理。…

    2017-06-13
  • lvs

    Lvs 一、lvs集群的类型:4类工作模式 1.1、lvs-nat 特点:通过将请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发。 客户端访问lvs集群服务,此时报文的源地址为cip,目标地址为vip,通过lvs进行dnat转发后端服务器主机,此时,报文的源地址为cip,目标地址为rip;后端主机响应时,报文源地址为rip,目标地…

    Linux干货 2016-10-30
  • linux初期了解

    计算机的组成及其功能 计算机有运算器,控制器,存储器,输出设备和输入设备组成: 1.运算器:运算器又称算术逻辑单元(Arithmetic Logic Unit简称ALU)。它是计算机对数据进行加工处理的部件,包括算术运算2.控制器:控制器负责从存储器中取出指令,并对指令进行译码 3.存储器:存储器是计算机记忆或暂存数据的部件。 4.输入设备:输入设备是给计算…

    Linux干货 2016-10-30