bash

shell脚本

Shell编程理论和运用

 

程序的编程风格和执行模式

    过程式:以指令为中心,来进行写程序,数据服务于指令。(bash shell)   C  

    对象式:以数据为中心,考虑先如何组织数据,指令服务于数据。  C#     C++   JAVA   PYTHON ……

 

shell程序   (调用二进制程序   解释执行)

程序的执行方式

    计算机:二进制指令

   

编程语言:

    低级:汇编语言

    高级:

        编译:高级语言-->编译器-->目标代码

        解释:高级语言-->解释器-->机器代码    shell   php   ruby   python

 

 

shell编程的执行模式

    顺序执行

    循环执行

    选择执行

shell编程的结构    bash shell 核心中心就是调用指令(堆命令,严重依赖当前环境)

    变量、数组

    表达式

    语句

 

shell脚本:文本文件   约定俗成要以.sh为结尾

结构和格式   shebang   #!/bin/bash   脚本声明

 

脚本的概念

将要执行的命令按照顺序保存到一个文本中

给文件相应的权限即可执行

结合控制语句可以完成复杂操作

 

 

 

脚本的应用场景

重复  批量事务处理  自动化运维  定期任务执行  服务器运行监控

脚本结构:脚本声明+注释(解释信息)+可执行语句

          结构和格式   shebang   #!/bin/bash

 

 

 

Shell程序的执行和Python程序的执行

Shell程序的执行

①:交互式shell环境

执行脚本

当前路径  ./  

绝对路径  /    (所有解释型语言通用,以上两种需要有执行权)

 

 

 

命令  bash  sh    不需要执行权

 

.  source  (这两种只在当前shell环境生效)

 

 

 

 

bash的单步执行:

bash -x /path/to/script     bash -n  /path/to/script     检查语法是否错误

 

 

 

 

 

变量的概念和运用

变量:是一段内存空间

Shell引用   ‘’:强引用,变量替换不会进行      "":弱引用,能够执行变量替换

 

``:命令替换,引用命令的执行结果,另外一种方式$()

 

 

变量替换:${变量名}      通常情况下大括号可以省略  如果变量名后面要跟如下内容:非小写字符串(包括大小字符串)、数字或下划线,那么变量名就一定要用大括号包起来 

 

和其他编程语言一样echo 显示

 

shell中的变量赋值    变量名=值(中间不要间隔空格)

注意:变量在赋值是不能再前面带$

             变量名只能包含字母、数字和下划线,并且不能以数字开头

            变量名区分大小写

            尽量能见名知义

 

定义变量

1:本地变量:只对当前shell进程有效,对其子shell以及其他shell都无效

定义变量:Var_Name="Value"

引用变量:${Var_Name}通常情况下大括号可以省略

撤销变量:unset Var_Name

2:局部变量:只对某一部分有效

     定义变量:local Var_Name="Value"

3:环境变量:对其shell进程及其子shell有效

     export Var_Name=”Value“

     Var_Name="Value"

     export Var_Name

 

系统内置的环境变量  env

 

位置变量  (shell特殊的变量)

$1,......$n   (需要传递参数)

特殊变量:

            $0:脚本名称自身

 

           $?:上一条命令的执行状态

               状态用数字表示:0-255

               0:表示成功

               1-255:失败,1.2.127.255预留

            $#   所有参数的总和数

            $*   所有参数列举出来

 

 

随机找两个文本打印出空行数量

 

 

 

随机选择两个文本,计算空行总和

 

 

1:变量的字符运算  expr

在bash shell中,不支持浮点型,不支持字符算术运算。

declare

      -i:整形变量

      -x: 环境变量,类似于export

     let:

       let varName=算术表达式

 

       varName=$[算术表达式]

 

       varName=$((算术表达式))

       varName=`expr 变量1 + 变量2 `

       除法运算有余数被省略(圆整)

 

      操作符:+,—,*,/,%(余数)

      let totalWeight+=2

      totalWeight=      $[$totalWeight+2]

      上面两个相同

       +=,-=,*=,/=,%=

       id++,id--,每次都+1

 

 

 

 

脚本循环控制语句

for      while      until

 

1for循环

for var_Name in 列表; do

循环体(正常执行的执行命令)

语句1

语句2

语句3

 ...

     done

bash -n 脚本文件检查脚本文件语法是否错误

seq:遍历元素

 

 

创建10个用户,用户名为user1-user10,并打印出它们的UID

 

 

 

1加到100的和数

 

 

 

 

2:交互式脚本(变量的赋值以交互式来进行)

read -p 交互

 

 

 

 

3:条件判断

测试方法:

①:test 条件表达式

②:[ 条件表达式 ] 或者  [[ 条件表达式 ]](注意两边至少有一个空格)

文件或目录测试     格式        [ 操作符  文件或目录 ]

 

-d:测试是否为目录

-f:测试是否为文件

-e:测试文件是否存在

-r:测试文件是否有读权

 

 

 

 

 

①   数数值比较测试   格式    [ 数值操作符  数值2 ]

操作符 -eq  -gt  -ge  -lt  -le 

       等于  大于   大于等于   小于   小于等于

 

 

 

逻辑测试

布尔值  (真  假)

与运算:

         && = 真(0

           && =

           && =

           && =

       或运算:

            || = 真(0

           || =

           || =

           || =

       非运算:

        !真 =

!假 =

 

 

 

 

 

 

 

 

4if语句判断(单分支  双分支  多分支)

if语句

格式

 if condition;then

      statement1

      ....

fi

 

    if conditionthen

      分支1

      else

        分支2

     fi

 

 

    if conditionthen

      分支1

    elif conditionthen

        分支2

    ...

    else

        分支n

     fi

 

 

 

 

 

 

 

 

 

5:程序执行状态返回值

bash :每个命令,执行状态都有返回值

       成功:0

       失败:非0

       $?

       脚本的状态返回值:脚本执行的最后一条命令:

       自定义脚本状态返回值:exit[n]

 

 

 

 

 

 

6case语句

格式  

       case 变量引用 in

条件1)

       分支1

       ;;

条件2)

       分支2

        ;;

  ......

  *)

       默认分支

       ;;

esac

[0-5][0-9]   [6-7][0-9]

 

 

 

 

 

 

7Wille循环 

    格式

 

while 条件测试;do

   循环体

 done

while循环:条件测试成功,则循环;失败,则退出

 如何退出?

   必须有时刻,条件测试不成功

     ? :条件控制变量

 

 如何让循环退出:在循环体中改变测试条件中用于控制循环次数的变量的值

 

 

 

 

while循环写一个脚本

Ping 10.10.16这个网段的主机,打印出可以ping通的和不能ping通主机的数量,要求10.10.16.50-10.10.16.100这个区间

结果为ping通主机的数量

     不能ping通主机的数量

 

 

 

 

 

 

 

 

8until循环  (条件测试不成功则循环)

 

 

 

9:函数

函数基本讲解

   过程式编程:代码重用

       模块化编程

       结构化编程

 

 

 

 

 

 

 

 

 

 

 

 

 

web网站架构和Nginx

①:网站架构原理

 

 

②:LNMP(基于python的web架构)

Linux+nginx+mysql+python

静态资源:客户端从服务器获得的资源表现形式与原文件相同

动态资源:通常是程序文件,需要服务器执行后,将执行结果返回给客户端。

 

注意:httpd服务器是纯静态的web服务器。

 

 

③:主流httpd服务器:Apache   Nginx

 

④:WSGI:Web服务器网关接口(Python Web Server Gateway Interface

Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。

自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。

 

⑤:Nginx介绍

    是一款开源的轻量级的高性能的静态资源web服务器、同时也是非常优秀反向代理服务器、缓存服务器、邮件代理服务器。

    最早由俄罗斯程序员伊戈尔·赛索耶夫开发,官方主页http://nginx.org

    理念和apache不一样,占用内存少、并发能力强、在中国大陆绝大部分的网站服务器都在使用。

属于web服务器解决方案领域的新贵,市场份额一路飙升。基于异步非阻塞I/O模型

 

安装方法:

         源码:编译安装

         官方的deb

sudo apt-get -y install nginx

 

配置文件目录:/etc/nginx

主配置文件:  /etc/nginx/nginx.conf

uwsgi参数配置文件:/etc/nginx/uwsgi_params

被主配置文件包含的配置文件:/etc/nginx/sites-available/default

网页根路径:/var/www/html

 

 

 

⑥:wsgi的web实现

          cd /tmp

sudo apt-get -y install build-essential python3-dev python3-pip python-pip curl

sudo pip3 install uwsgi

sudo curl http://uwsgi.it/install | bash -s default /tmp/uwsgi

sudo mkdir /myweb

cd /myweb

sudo vim test.py

 

 

def application(env,start_response):

    body = 'hello ujiuye.'

    status = '200 OK'

    headers = [('content-type', 'text/html'), ('content-length',str(len(body))) ]

    start_response(status,headers)

return [body.encode()]

 

 

 

sudo uwsgi --http :9090 --wsgi-file /myweb/test.py --master --processes 4 --threads 2

 

LINUX+NGINX+UWSGI+MYSQL

 

 

⑦:Nginx反向代理uwsgi,实现静态页面和动态页面的分离

Nginx实现反向代理,需要基于proxy模块,语法如下

 

server {

    listen

    server_name

    location / {

        proxy_pass

    }

}

 

 

sudo nginx -t  (检查语法)

sudo service nginx restart (重启服务)

 

 

 

 

 

 

 

 

 

posted @ 2020-08-30 22:43  白菜先森  阅读(312)  评论(0)    收藏  举报