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)
上一篇 2016-08-15 09:24
下一篇 2016-08-15 09:24

相关推荐

  • 说明Linux系统上命令的使用格式

    命令使用格式: COMMAND [OPTIONS…] [ARGUMENTS…]         选项:用于启用或关闭命令的某些功能                  短选项:-c(一个字符 ),例如:-l,…

    Linux干货 2016-10-31
  • N23 9月底的

    1.linux下文件管理命令 cat 读取文件 或者连接显示touch 建立文件 改变时间 cp 复制文件 -f 强制复制 不论覆盖-r 连同子目录递归处理-l 建立硬链接-s 建立符号连接 rm 删除文件 -r 递归删除 连同子目录也一起干掉-f 强制 删除文件或者目录-d 直接删除目录 file 辨识文件类型 find 查找文件 whereis 查找文件…

    Linux干货 2016-09-25
  • SElinux 练习

    练习 .1、安装httpd服务,改变网站的默认主目录为/website,添加SELinux文件标签规则,设置http_sys_content_t到/website及目录下所有文件,使网站可访问 mkdir    /website vim    /etc/httpd/conf/ht…

    Linux干货 2016-09-19
  • shell脚本基础

    1、编程基础     程序:指令+数据   程序编程风格:                         过程式:以指令为中心,数据服务于指令         &nbs…

    2017-04-20
  • Linux基本知识之Vim编辑器

    vim文本编辑器:    vim是Linux系统上的最著名的文本/代码编辑器,也是早年的vi编辑器的加强版,而gVim则是其windows版。它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门变得困难,但上手之后键盘流的各种巧妙组合操作却能带来极大幅度的效率的提升。 (1)打开文件与关闭文件:     …

    Linux干货 2016-08-10