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
1:for循环
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:测试文件是否有读权
① 数数值比较测试 格式 [ 数值1 操作符 数值2 ]
操作符 -eq -gt -ge -lt -le
等于 大于 大于等于 小于 小于等于
逻辑测试
布尔值 (真 假)
与运算:
真 && 真 = 真(0)
真 && 假 = 假
假 && 真 = 假
假 && 假 = 假
或运算:
真 || 真 = 真(0)
真 || 假 = 真
假 || 真 = 真
假 || 假 = 假
非运算:
!真 = 假
!假 = 真
4:if语句判断(单分支 双分支 多分支)
if语句
格式
if condition;then
statement1
....
fi
if condition;then
分支1;
else
分支2;
fi
if condition;then
分支1;
elif condition;then
分支2;
...
else
分支n;
fi
5:程序执行状态返回值
bash :每个命令,执行状态都有返回值
成功:0
失败:非0
$?
脚本的状态返回值:脚本执行的最后一条命令:
自定义脚本状态返回值:exit[n]
6:case语句
格式
case 变量引用 in
条件1)
分支1
;;
条件2)
分支2
;;
......
*)
默认分支
;;
esac
[0-5][0-9] [6-7][0-9]
7:Wille循环
格式
while 条件测试;do
循环体
done
while循环:条件测试成功,则循环;失败,则退出
如何退出?
必须有时刻,条件测试不成功
? :条件控制变量
如何让循环退出:在循环体中改变测试条件中用于控制循环次数的变量的值
用while循环写一个脚本
Ping 10.10.16这个网段的主机,打印出可以ping通的和不能ping通主机的数量,要求10.10.16.50-10.10.16.100这个区间
结果为ping通主机的数量
不能ping通主机的数量
8:until循环 (条件测试不成功则循环)
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 (重启服务)

浙公网安备 33010602011771号