Linux 的shell脚本编程

时间:2022-09-14 15:35:29

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 �Ci 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型号,内存大小,硬盘大小。

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


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

Linux 的shell脚本编程

Linux 的shell脚本编程


本文出自 “zczx_展鸿” 博客,请务必保留此出处http://swzczx.blog.51cto.com/11767585/1837773