本文主要是介绍【046】Python全栈日记-Linux(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本次为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实现动态。
这篇关于【046】Python全栈日记-Linux(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!