【046】Python全栈日记-Linux(四)

版权声明:作者:人学物理死的早 出处:https://blog.csdn.net/weixin_39561473 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。 https://blog.csdn.net/weixin_39561473/article/details/86517472

本次为linux最后一次日记,下一阶段将要进行django的学习,也是python最重要的一个部分,django将要串通我们之前学习的所有内容,本次在结尾也会做一个小的引入。

今天使用root用户进行编程,这样就不会提示权限不够了,切换方法

sudo su root,然后输入密码

如果忘记密码可以使用sudo passwd root来修改密码

一、Shell编程理论和运用

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

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

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

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

程序的执行方式

计算机:二进制指令

计算机是无法识别我们敲的代码的,需要变为二进制指令计算机才能使用。

而shell就是一个解释我们所写代码变为二级制代码给计算机执行的程序

   

3、编程语言:

低级:汇编语言

高级:

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

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

解释语言的效率会低于编译,编译就相当于对整本书进行翻译,而解释就相当于同声翻译。

4、shell编程的执行模式(和python一致)

顺序执行

循环执行

选择执行

5、shell编程的结构   

我们常的shell为bash shell

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

写一个简单的shell脚本理解一下何为堆命令,用vim编写一个脚本名为:text.sh。

保存退出,然后通过sh text.sh执行

这样一个简单的脚本就完成了。

严重依赖环境的意思就是,你写的脚本为数据库管理,如果你的linux没有建数据库,脚本就失效了。

6、脚本应用场景和格式

(1)应用场景

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

(2)格式

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

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

#!/bin/bash:脚本声明

编写人(选写)

编写日期(选写)

脚本声明的意思就是,我要使用bash来解释本脚本

如果是python的脚本,就要使用#!usr/bin/python3来声明

7、脚本的概念

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

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

chmod  a=x  /xxxx.sh

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

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

(1)Shell程序的执行

【1】当前路径  ./  

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

修改权限:

编写脚本内容vim text.sh

echo就是print()

执行文件:

【3】命令bash、sh :不需要执行权

sh是使用默认shell执行脚本

bash是使用bash shell执行脚本

(2)执行python文件

先创建python文件,直接vim一个不存在的文件就是新建并编辑。

执行:

(3)bash的单步执行:

bash -x /path/to/script :相当于dubug,检查每一步如何运行    

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

没有错误不会有返回。

二、变量的概念和运用

1、变量:是一段内存空间

变量不用声明,直接赋值即可

在shell中使用变量一定要加上$,例如$a、$i

2、Shell引用

(1)‘ ’:强引用,变量替换不会进行

(2)“ ”:弱引用,能够执行变量替换,就是正常使用变量

(3)``:命令替换,引用命令的执行结果,另外一种方式$(),反引号在1键的左边。

第一个ls我们查看有什么文件。

第二个`ls`是执行ls的结果也就是执行fstab,因为不存在这个命令,所以显示未找到。

第三个是打印`ls`代表什么,也就是打印ls命令后的结果,就是fstab

(4)变量替换:${变量名}

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

例如我们存一部分dns

这样非常明显能看出来是10.10.16.101,如果不用大括号框住dns就很不美观。

3、echo

和其他编程语言一样echo 代表打印print

4、shell中的变量赋值   

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

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

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

变量名区分大小写

尽量能见名知义

5、定义变量

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

定义变量:Var_Name="Value"

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

撤销变量:unset Var_Name

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

定义变量:local Var_Name="Value"

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

系统内置的环境变量可以env命令查看

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

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

直接写在脚本里,然后使用脚本的时候写入参数,例如

脚本内容:对传入的文件显示其中空行(^$:正则表达式)

结果:bash test.sh /etc/passwd /etc/fstab

7、特殊变量:

(1)$0:脚本名称自身

(2)$#所有参数的总和数

(3)$*所有参数列举出来

执行脚本:

(4)程序执行状态返回值

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

状态用数字表示:0-255

0:表示成功

1-255:失败,1.2.127.255预留

当执行命令成功,正确、true就会返回0

错误就会返回非0的数。

三、变量运算

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

因为shell会把算术当作命令执行。

1、运算符

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

(2)复合赋值符

【1】+=,-=,*=,/=,%=

a+=b 等于a=a+b,剩下同理

【2】id++,id—

Id++等于Id = id + 1

Id—等于Id = id - 1

2、可以通过以下方式进行运算:

(1)let:

let varName=算术表达式

echo打印的时候变量一定要加$

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

以下为骨灰级程序员才会使用,效率较低

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

(4)varName=`expr 变量1 + 变量2 `

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

即使是0.99也是0

注意:如果在函数中用let写运算,用sh执行时显示let no found的

或者在函数中使用$[1+2]做计算,用sh执行显示1+2字符串的

造成这个问题的原因是ubantu默认使用的shell为dash,dash只有bash一部分的功能。

两种方法解决:

1、不使用sh执行脚本sh是使用默认shell,使用bash或者./

2、修改默认shell

Sudo dpkg-reconfigure dash

选择No,使用bash作为默认shell

四、脚本循环控制语句

for  while  until

1、先学习一个类似python中range的东西

Seq遍历元素

语法:seq 起点 步长 终点

当我们使用的时候seq的时候因该加上反引号,因为我们需要的是seq的结果。

2、for循环

例如写一个脚本,创建10个文档,名字为text1-text10

执行bash mingming.sh、结果:

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

练习:

(1)创建10个用户,并显示其uid

结果

(2)1加到100的和数

3、输入命令(变量的赋值以交互式来进行)

read -p 交互文字 变量

就是python中的input,输入命令

五、条件判断

1、测试方法:

(1)test 条件表达式

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

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

-d:测试是否为目录

-f:测试是否为文件

-e:测试文件是否存在

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

Test例子:

条件表达式

2、数值比较测试  

格式 :[ 数值1  操作符  数值2 ]

操作符

-eq : 等于

-gt : 大于

-ge : 大于等于

-lt : 小于

-le : 小于等于

              

3、逻辑测试

布尔值(真:0  假)

(1)与运算:&&

真 && 真 = 真(0)

真 && 假 = 假

假 && 真 = 假

假 && 假 = 假

如果第一个为假就不往后看了,输出假

(2)或运算:

真 || 真 = 真(0)

真 || 假 = 真

假 || 真 = 真

假 || 假 = 假

如果第一个为真,就不往后看了,输出为真

(3)非运算:

!真 = 假

!假 = 真

练习题,统计用户数(etc/passwd),如果大于30个用户,输出总共多少用户。

一定要在给指令加上反引号``,因为我们给sum赋值的是指令的结果,而不是把指令赋值给sum

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

(1)If单分支格式

例子:字符串可以用==表示的等于,但是数字比值只能使用-eq表示等于。

(2)if双分支结构  

例子:

(3)if多分支结构

例子1:输入名字判断是谁

例子2:成绩分类60以下不及格,60-80及格,80-99满意,100满分

例子3:成绩分类折半优化60以下不及格,60-80及格,80-99满意,100满分

5、case语句

格式  :

例子1:名字判断

例子2.成绩分类,由于case的条件不能添加多个条件选择所以使用[0-9][0-9]的方法来拼凑数字。

6、Wille循环 

格式

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

必须有时刻条件测试不成功,要不就会造成死循环,在linux下死循环很致命。所以需要在循环体中改变测试条件中用于控制循环次数的变量的值。

例1:1到100之和,数学运算时一定要加上let,一定别忘步长

例2:用while循环写一个脚本

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

结果为:

ping通主机的数量

不能ping通主机的数量

(这个题看看方法就行,因为我们在一个局域网中,10.10.16这个网段有我们很多的机器,自己练习应该是一个都无法ping通的)

例3:100以内素数

例4.斐波那契数列

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

条件不满足循环,直到满足就退出循环,和while是反的

六、shell函数

和python基本一致,甚至更简单,连def都不用加了。

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

代码重用可以用函数代替

1、shell函数格式 (老师上课一笔带过,我这摘自菜鸟联盟)

说明:

(1)可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

(2)参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

事例:

结果:

2、下面定义一个带有return语句的函数:

脚本内容:

结果:

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

3、函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

带参数的函数示例:

结果:

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

七、web网站架构和Nginx(概述)

1、网站架构原理

客户端通过http协议(tcp)连接httpd服务器,python使用的httpd服务器为nginx,nginx处理静态资源没有问题,但是处理动态资源(.py)非常差,所以需要wsgi来实现动态资源。

2、LNMP(基于python的web架构)

LNMP=Linux+nginx+mysql+python

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

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

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

这里就和当初前端的静态动态不同了,前端中html+css为静态,js为动态。

3、主流httpd服务器:Apache   Nginx

4、WSGI:Web服务器网关接口(Python Web Server Gateway Interface)

(1)Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。WSGI是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。

(2)uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

(3)要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

WSGI是一种通信协议。

uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。

而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

5、Nginx介绍

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

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

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

属于web服务器解决方案领域的新贵,市场份额一路飙升。

(1)安装方法:

【1】源码:编译安装

【2】官方的rpm包:在linux下输入命令

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

(2)使用nginx

【1】开启nginx

sudo nginx

【2】查询自己的ip

Ip a

在自己家一般是192开头的,然后在浏览器输入ip

【3】修改网页静态资源

在/var/www/html下有个index.nginx-debian.html

这就是刚才那个网页的html文件,删除这个文件,把在前端阶段做的京东页面整个挪进来。

再次在浏览器中输入ip并加上/京东,因为京东是个文件夹,如果是把文件夹中内容直接放在html目录下,就不用加/京东

当然我们还可以修改ip,通过我们指定的ip进入我们做的网页。

这是使用nginx实现静态资源,那像python写的动态文件能否实现呢?在html目录下写一个py文件,内容为print(“hello world”)。

在chorme浏览器中输入ip/py.py,你会发现,py文件被下载,而不是执行(不同浏览器表现不同,但是都不会执行),这就是最开始提到的,nginx处理动态资源(.py)非常差。这时候就需要wsgi来协助了。

6、wsgi的web实现(通过linux服务器实现网页页面)

(1)进入临时文件目录下,方便后来修改

cd /tmp

(2)安装所需环境

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

如果出现依赖问题,请使用sudo apt-get autoremove 文件名 删除依赖文件

(3)安装uwsgi

对python来说,uWSGI的安装方式很多:

【1】通过pip

pip3 install uwsgi

【2】通过网络安装

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

这种方式会在/tmp/uwsgi路径下安装二进制版本,并且可以随意改变它。

推荐两个都执行一次,避免出问题

(4)创建目录,创建py文件

sudo mkdir /myweb

cd /myweb

sudo vim test.py

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()]

(5)启动wsgi

默认情况下uWSGI只会开启一个进程和一个线程。

你可以用--processes选项和--threads选项添加更多的进程和线程。

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

以上命令将会产生一个主进程,4个工作进程,和http路由。主进程会控制4个工作进程结束时再重新生成新的进程。每个工作进程下有2个线程。端口为9090。执行完别关闭。结束进程可使用ctrl+c

开启uwsgi后,在浏览器中输入ip:9090,因为我们设置了9090端口,就能实现py文件的内容:

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

就是直接使用ip+py文件执行,而不需要端口。

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

(1)实现这个功能,需要修改nginx的、被主配置文件包含的配置文件:

/etc/nginx/sites-available/default

通过vim打开/etc/nginx/sites-available/default配置文件,然后在图中位置处:

(2)添加下图代码:

添加后如图:

保存退出

(3)检查语法是否有误:sudo nginx -t

(4)重启nginx服务:sudo service nginx restart

(5)最后启动wsgi

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

在浏览器中输入ip/text.py

这样就实现静态页面和动态页面的分离nginx实现静态,wsgi实现动态。

猜你喜欢

转载自blog.csdn.net/weixin_39561473/article/details/86517472
今日推荐