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

相关推荐

  • inotify介绍及rsync + inotify 实时同步备份

    1、前言 rsync (remote sync)是一款非常好的数据同步工具,能够通过对比同步双方的数据变动,实现增量同步,还可以通过LAN/WAN实现远程多台主机间文件的同步,还能结合crond任务计划来执行自动备份,又可以结合ssh实现远程数据备份的安全,种种特性使他看起来相当优秀。但如果需备份数据十分庞大时,它的不足之处就显现出来了,比如每次执…

    Linux干货 2016-06-15
  • 备份练习

    课外整理 cp 功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息参数:     -a 或 –archiv…

    Linux干货 2016-08-08
  • 高可用keepalived

    21.高可用之keepalived                keepalived实现wrrp热网关备份:        配置网关上的keepalived,配置文件如下         …

    2017-05-15
  • PXE批量部署linux操作系统

       前言    在实际生产环境中,有时候我们会碰到为几十上百甚至上千台服务器安装Linux操作系统的需求,如果我们还是常规的去使用移动介质逐台安装,显然是一件低效又令人抓狂的事情,那要安装到何年何月啊?这对于我们追求高逼格形象的技术人员来讲当然是不可以接受的,为此,pxe模式批量部署系统应运而生。   &n…

    Linux干货 2015-05-23
  • etc的常见问答

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

    2017-12-26
  • 分布式文件系统之MogileFS

    MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和…

    Linux干货 2017-06-16