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

相关推荐

  • linux下手工创建新用户

    当我们要创建一个用户时,通常使用useradd命令就可以自动创建了一个用户;实际上,在linux下,一切皆文件,设置好几个文件,也是可以创建出一个用户: 文件如下: /etc/passwd  :用户 /etc/shadow  :密码 /home/username:用户家目录 /etc/group:用户组 /etc/skel/*: &nbs…

    Linux干货 2015-03-30
  • Linux发展史

    日期:2016-10-12  Bell,MIT与GE的『Multics』系统     早期的计算机还很不普遍,除非是军事或者高科技用途,或者学术单位的学术研究,否则真的很难接触到。而且计算机架构很难使用。那个时候,程序设计者必须先将程序相关的信息在读卡纸上面打洞然后将读卡纸插入卡片阅读机来将信息读入主机中运算…

    Linux干货 2016-10-14
  • 运维工程师技能需求排行

    这是我今天在拉勾网搜索运维,翻完了4四页也招聘信息之后得到的,我的目的是想要看看之后的学习,哪个更应该成为重点,有些在我意料之中,有些还真的没想到,算是努力了一个小时的收获吧,分享给大家。
    注意:其中的看法仅代表个人观点,很多都是依靠我自己的学习经验和工作经验累积的

    Linux干货 2017-12-12
  • linux网络管理

    在 /etc/udev/rules.d/路径下有个70-persistent-ipoib.rules文件,;里边有关于网卡信息的配置,,,在里边可以更改网卡的名字 注意:修改完之后要在/etc/sysconfig/network-scripts/ifcfg-eth0中修改,不然不能使用。 在Centos6以后有一个服务NetworkManager,他可以自动…

    Linux干货 2016-09-06
  • grub的启动加密及删除恢复

    一、实验1:设置grub口令 1、生成一个加密运算为"nd5"的密码 2、设置grub口令 3、测试grub是否已加密 4、在虚拟机的下图的图形界面中,直接敲"Esc"或者"e"键 5、在图形的框下,提示只能敲"p"键,原因是因为grub加密的原因 6、直接敲"p&qu…

    Linux干货 2016-10-04
  • Linux第七周小结

    1、创建一个10G分区,并格式为ext4文件系统 a) 要求其block大小为2048,预留空间百分比为2,卷标为MYDATA,默认挂载属性包含acl; b) 挂载至/data/madata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; 2、创建一个大小为1G的swap分区,并创建好文件系统,并启用之 3、写一个脚本 a)&…

    2017-08-13