1、课程回顾
2、课程大纲
1、shell编程
开发和运维
shell基础知识
shell变量
shell表达式
shell流程控制语句

2、代码发布
项目周期
代码部署的方式
代码部署流程
服务器环境部署
手工方式部署代码
脚本方式部署代码




3、shell
3.1、开发和运维
3.1.1 开发
开发是什么?
岗位
项目代码的开发
给公司带来效益

开发会运维如何
1、技能提升
2、面试有优势


开发人员发展规划
开发人员 -- 开发组长 -- 开发经理 --- 更高岗位cto
技术熟练、熬死他们   了解:精益管理和敏捷开发 运维、熟练精益管理和敏捷开发、devops
网络、数据库、存储、虚拟化、云计算、
Docker、持续集成和持续交付
项目访问流程
1、用户访问前端
2、前端转移数据请求给web服务器
3、涉及到数据调用,和数据库进行交互

3.1.2 运维
运维是什么
岗位

常见技术岗位:
产品、开发、测试、运维

运维的工作范围
规划、管理、安全、监控、告警、规范和流程、平台、优化

团队
项目 -- 多个团队(应用)
团队 多个组
多个人



自动化运维
基础:脚本自动化
分类:
开发人员:开发语言脚本
运维人员:shell脚本


3.2 shell 基础知识
3.2.1 shell 是什么
shell 贝壳
shell就是一个命令解释器[重点]

3.2.2 shell 分类
基本上shell分两大类:
图形界面shell和命令行shell

图形界面shell
gnome,kde

命令行shell
windows:cmd.exe
linux:bash

shell的历史:
sh ksh csh bash[重点]
1970左右
程序设计语言

常见的linux发行版本:
ubuntu
centos
6.5-6.8   7.0
redhat
debain
生产上重点:
稳定压倒一切

shell命令执行特点:
逐行输入命令、逐行进行确认



3.2.3 shell 脚本
shell脚本是什么
就是一堆可执行命令的组合[重点]

shell脚本开发规范
1、命名:
要有意义,后缀.sh
2、首行
是而且必须是命令解释器
3、注释
简单描述脚本信息
4、执行
bash 脚本名称
5、脚本内容
从上到下,依次执行。
6、其他
成对的符号,成对写,避免丢失
() {} [] '' ""
流程格式:
先写完,然后填空
缩进
仅仅是表示美观


脚本执行方式
方式一:
bash 脚本名称
bash test.sh
/bin/bash /data/scripts/python10/test.sh

场景:
工作中常用[*****]

方式二:
文件的路径
示例:
/data/scripts/python10/test.sh
./test.sh

重点:
文件一定要有执行权限

场景:
工作中常用

方式三:
source 或者 .
加载

场景:
保证环境一致性

案例:
某个脚本在你自己的笔记本可以执行成功,但是在其他人机器上执行失败,
原因就是:环境不一致

超前知识点:
命令变量的定义:
dir=`pwd`
查看变量的方式
echo $dir



注释
单行注释: #
多行注释:
:<<!。。。!

示例:
#!/bin/bash
:<<!
脚本描述:测试命令行输入
作者:python 13期
版本:v1.0
联系方式:中南海
!
dir=`pwd`
echo $dir

3.2.4 shell & python


执行方式
shell脚本直接调用系统命令执行

为什么运维shell使用比例比python高
执行python --- 导入模块 -- 模块调用系统命令 --- 执行

调用系统命令情况下,
shell效率比python高

对比

shell 杀猪刀 干净利索
python 导弹 需要模块帮助、实现功能多、


3.3 shell 变量
3.2.1 shell变量是什么
变量:
存储动态值的一个抽象概念

变量包括两部分:
变量名 不变的
变量值 变化的


变量之歌:
星星还是那个星星

变量名 星星
变量值 时间

散文 形散而神不散
变量名
变量值 形式

我的角色
变量名
变量值 角色


3.2.2 常见变量


本地变量
在本地有效

全局变量
在当前系统下,所有环境都有效

内置变量
bash中内置了很多变量,我们可以直接拿过来使用


3.2.3 本地变量
普通变量:
方式一:
变量名=变量值
重点:
变量值必须是一个整体,中间么有特殊字符

方式二:
变量名='变量值'
重点:
我看到的内容,我就输出什么内容

方式三:
变量名="变量值"
重点:
如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B

示例:
# echo $hello


# hello=nihao
# echo $hello
nihao
# hello1=nihao 666
666: command not found
# hello1="nihao 666"
# echo $hello1
nihao 666
# hello2='nihao 777'
# echo $hello2
nihao 777
# echo $hello
nihao
# hello3='nihao 666-$hello'
# echo $hello3
nihao 666-$hello
# hello4="nihao 666-$hello"
# echo $hello4
nihao 666-nihao


命令变量
变量名=`命令`
变量名=$(命令)

执行流程:
1、执行命令
2、将命令执行后的结果,赋值给新的变量名A



变量的查看:


方式一:
$变量名
场景:
私下里,在命令行/脚本中使用
图省事
方式二:
${变量名}
场景:
echo " dsa  dsafsa  dsafsa ${变量名} f "

方式三:
"${变量名}"
场景:
标准使用方式,




3.3.4 全局变量
定义方式:
方式一:
1、首先定义一个本地变量
2、使用export声明这个本地变量为全局变量
示例:
root@admina-virtual-machine:/data/scripts/python10# hello5=qiang666
root@admina-virtual-machine:/data/scripts/python10# export hello5=qiang666
root@admina-virtual-machine:/data/scripts/python10# env | grep hello
hello=nihao
hello5=qiang666
hello1=nihao 666



方式二:
我定义本地变量的同时,使用export声明本地变量为全局变量

示例:
root@admina-virtual-machine:/data/scripts/python10# export hello5=qiang666
root@admina-virtual-machine:/data/scripts/python10# env | grep hello
hello=nihao
hello5=qiang666
hello1=nihao 666


全局变量查看方式
查看方式:
env
set
declare



删除变量
格式:
unset 变量名

示例:
root@admina-virtual-machine:/data/scripts/python10# env | grep hello
hello=nihao
hello5=qiang666
hello1=nihao 666
root@admina-virtual-machine:/data/scripts/python10# unset hello
root@admina-virtual-machine:/data/scripts/python10# unset hello1
root@admina-virtual-machine:/data/scripts/python10# unset hello2
root@admina-virtual-machine:/data/scripts/python10# unset hello3
root@admina-virtual-machine:/data/scripts/python10# unset hello4
root@admina-virtual-machine:/data/scripts/python10# unset hello5
root@admina-virtual-machine:/data/scripts/python10# env | grep hello
root@admina-virtual-machine:/data/scripts/python10# echo $hello2


root@admina-virtual-machine:/data/scripts/python10# echo $hello3


root@admina-virtual-machine:/data/scripts/python10# echo $hello4


3.3.5 内置变量
跟脚本文件有关系的变量
$0 获取脚本的名称
示例:
root@admina-virtual-machine:/data/scripts/python10# bash file1.sh 
我脚本的名称是: file.sh
我脚本的名称是:file1.sh
root@admina-virtual-machine:/data/scripts/python10# cat file1.sh 
#!/bin/bash
# 获取脚本的名称
echo "我脚本的名称是: file.sh"
echo "我脚本的名称是:$0"
场景:
获取当前脚本的使用方式
root@admina-virtual-machine:/data/scripts/python10# bash file1.sh 
file1.sh 脚本的使用方法:file1.sh  [ arg1 | arg2 ]
root@admina-virtual-machine:/data/scripts/python10# cat file1.sh 
#!/bin/bash
# 获取脚本的名称
echo "$0 脚本的使用方法:$0  [ arg1 | arg2 ]"


$# 获取当前脚本传入参数的数量
示例:
root@admina-virtual-machine:/data/scripts/python10# cat num.sh 
#!/bin/bash
# 获取当前脚本传入的参数数量
echo "当前脚本传入的参数数量是: $#"
root@admina-virtual-machine:/data/scripts/python10# bash num.sh 
当前脚本传入的参数数量是: 0
root@admina-virtual-machine:/data/scripts/python10# bash num.sh a
当前脚本传入的参数数量是: 1
root@admina-virtual-machine:/data/scripts/python10# bash num.sh a dsanfdsn dsa f ds f ds af dsa f dsa f dsa f ds fds  fds af ds  fds  fds  fds f sa f ds af ds af dsa  sd f dsa  fd
当前脚本传入的参数数量是: 34


场景:
判断我输入的参数数量是否是我要求的个数


需求:
我的脚本只允许传入两个参数,如果输入参数不对,那么输出脚本的执行帮助

root@admina-virtual-machine:/data/scripts/python10# cat num1.sh 
#!/bin/bash
# 判断传入参数数量
[ "$#" -eq 2 ] && echo "$0 开始执行..."
[ "$#" -eq 2 ] || echo "$0 帮助: $0 [ arg1 ]"
root@admina-virtual-machine:/data/scripts/python10# bash num1.sh 
num1.sh 帮助: num1.sh [ arg1 ]
root@admina-virtual-machine:/data/scripts/python10# bash num1.sh 2
num1.sh 帮助: num1.sh [ arg1 ]
root@admina-virtual-machine:/data/scripts/python10# bash num1.sh 2 2
num1.sh 开始执行...




$n 获取当前脚本传入的第n个位置的参数
示例:
root@admina-virtual-machine:/data/scripts/python10# cat weizhi.sh 
#!/bin/bash
# 获取指定位置的参数
echo "第一个位置的参数是: $1"
echo "第二个位置的参数是: $2"
echo "第三个位置的参数是: $3"
echo "第四个位置的参数是: $4"
root@admina-virtual-machine:/data/scripts/python10# bash weizhi.sh 1
第一个位置的参数是: 1
第二个位置的参数是: 
第三个位置的参数是: 
第四个位置的参数是: 
root@admina-virtual-machine:/data/scripts/python10# bash weizhi.sh 1 2 3 4
第一个位置的参数是: 1
第二个位置的参数是: 2
第三个位置的参数是: 3
第四个位置的参数是: 4


场景:
1、脚本同时传入多个参数
2、脚本中有不同的函数专门调用不同位置的传参

执行脚本的方式:
bash 脚本名  arg1  arg2

脚本的内容:
函数1 $1
函数2 $2


$? 获取文件执行或者命令执行的返回状态值
示例:
root@admina-virtual-machine:/data/scripts/python10# bash nihao
bash: nihao: No such file or directory
root@admina-virtual-machine:/data/scripts/python10# echo $?
127
root@admina-virtual-machine:/data/scripts/python10# ls
file1.sh  num.sh  test.sh  weizhi.sh
root@admina-virtual-machine:/data/scripts/python10# echo $?
0
root@admina-virtual-machine:/data/scripts/python10# llllllll
llllllll: command not found
root@admina-virtual-machine:/data/scripts/python10# echo $?
127

场景:
root@admina-virtual-machine:/data/scripts/python10# bash zhuangtai.sh 
执行返回状态值是 0
/data/scripts/python10
执行返回状态值是 0
当前dir位置是 /data/scripts/python10
执行返回状态值是 0
root@admina-virtual-machine:/data/scripts/python10# cat zhuangtai.sh 
#!/bin/bash
# 文件执行返回状态值演示
cd /data/scripts/python10
echo "执行返回状态值是 $?"
pwd
echo "执行返回状态值是 $?"
./test.sh
echo "执行返回状态值是 $?"




获取随机字符串
场景
创建一个用户,密码是随机生成

生成随机数
$RANDOM 生成随机的5位数以内的数字

示例:
root@admina-virtual-machine:/data/scripts/python10# echo $RANDOM
18061
root@admina-virtual-machine:/data/scripts/python10# echo $RANDOM | md5sum
27e8fda6333d9716503ff007cbd4cdb7  -
root@admina-virtual-machine:/data/scripts/python10# echo $RANDOM | md5sum | awk '{print $1}'
3a8d2e3493d99151f43b68df8ab09fdc
root@admina-virtual-machine:/data/scripts/python10# str=$(echo $RANDOM | md5sum | awk '{print $1}')
root@admina-virtual-machine:/data/scripts/python10# echo $str
e111ef894a8fd92979c4331386901381



字符串相关的内置变量
截取
${变量名:起始位置:截取长度}

示例:从头截取8个字符
root@admina-virtual-machine:/data/scripts/python10# echo $str
e111ef894a8fd92979c4331386901381
root@admina-virtual-machine:/data/scripts/python10# echo ${str:0:8}
e111ef89

示例:从第5个位置开始,截取8个字符
root@admina-virtual-machine:/data/scripts/python10# echo ${str:4:8}
ef894a8f


示例:从末尾截取8个字符
root@admina-virtual-machine:/data/scripts/python10# echo ${str: -8}
86901381
root@admina-virtual-machine:/data/scripts/python10# echo ${str:0-8}
86901381
注意:
${str: -8}
${str:0-8}

只有一个冒号,空格或者0 


默认值
场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容

格式:
${变量名:-默认值}

套餐示例:
如果我输入的参数为空,那么输出内容是 "您选择的套餐是: 套餐 1"
如果我输入的参数为n,那么输出内容是 "您选择的套餐是: 套餐 n"

root@admina-virtual-machine:/data/scripts/python10# cat select.sh 
#!/bin/bash
# 套餐选择演示
a="$1"


echo "您选择的套餐是: 套餐 ${a:-1}"
root@admina-virtual-machine:/data/scripts/python10# bash select.sh 
您选择的套餐是: 套餐 1
root@admina-virtual-machine:/data/scripts/python10# bash select.sh 2
您选择的套餐是: 套餐 2
root@admina-virtual-machine:/data/scripts/python10# bash select.sh 6
您选择的套餐是: 套餐 6




场景二:
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
场景示例:
不管我说国家法定结婚年龄是 多少岁,都输出 国家法定结婚年龄(男性)是 22 岁

root@admina-virtual-machine:/data/scripts/python10# cat age.sh 
#!/bin/bash
# 默认值演示示例二
a="$1"
echo "国家法定结婚年龄(男性)是 ${a+22} 岁"
root@admina-virtual-machine:/data/scripts/python10# bash age.sh 3
国家法定结婚年龄(男性)是 22 岁
root@admina-virtual-machine:/data/scripts/python10# bash age.sh 300
国家法定结婚年龄(男性)是 22 岁



3.4 shell 表达式
3.4.1 shell验证操作
方式一:
[ 表达式 ]

0 表示表达式成立
1 表示表达式不成立

方式二:
test 表达式

示例:
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 1 ]
root@admina-virtual-machine:/data/scripts/python10# echo $?
0
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 2 ]
root@admina-virtual-machine:/data/scripts/python10# echo $?
1
root@admina-virtual-machine:/data/scripts/python10# test 1 = 1
root@admina-virtual-machine:/data/scripts/python10# echo $?
0
root@admina-virtual-machine:/data/scripts/python10# test 1 = 2
root@admina-virtual-machine:/data/scripts/python10# echo $?
1


3.4.2 shell表达式
逻辑
&&
命令1  &&  命令2
如果命令1执行成功,那么我才执行命令2 -- 夫唱妇随
如果命令1执行失败,那么命令2也不执行
示例:
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 1 ] && echo "条件成立"
条件成立
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 2 ] && echo "条件成立"
root@admina-virtual-machine:/data/scripts/python10# 

||
命令1 || 命令2
如果命令1执行成功,那么命令2不执行 -- 对着干
如果命令1执行失败,那么命令2执行
示例:
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 2 ] || echo "条件不成立"
条件不成立
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 1 ] || echo "条件不成立"
root@admina-virtual-machine:/data/scripts/python10# 


文件

-f 判断输入内容是否是一个文件
示例:
root@admina-virtual-machine:/data/scripts/python10# [ -f weizhi.sh ] && echo "是一个文件"
是一个文件
root@admina-virtual-machine:/data/scripts/python10# [ -f weizhi.sddh ] || echo "不是一个文件"
不是一个文件

-d 判断输入内容是否是一个目录
示例:
root@admina-virtual-machine:/data/scripts/python10# [ -d weizhi.sddh ] || echo "不是一个目录"
不是一个目录
root@admina-virtual-machine:/data/scripts/python10# mkdir nihao
root@admina-virtual-machine:/data/scripts/python10# ls
age.sh  file1.sh  nihao  num1.sh  num.sh  select.sh  test.sh  weizhi.sh  zhuangtai.sh
root@admina-virtual-machine:/data/scripts/python10# [ -d nihao ] && echo "是一个目录"
是一个目录

-x 判断输入内容是否可执行
示例:
root@admina-virtual-machine:/data/scripts/python10# [ -x age.sh ] || echo "文件没有执行权限"
文件没有执行权限
root@admina-virtual-machine:/data/scripts/python10# [ -x test.sh ] && echo "文件有执行权限"
文件有执行权限
root@admina-virtual-machine:/data/scripts/python10# [ -x test.sh ] && ./test.sh 
当前dir位置是 /data/scripts/python10

数字
-gt 大于
-lt 小于
-eq 等于
-ne 不等于

场景:
root@admina-virtual-machine:/data/scripts/python10# cat num2.sh 
#!/bin/bash
# 数字表达式 -ne使用场景
[ "$#" -ne 2 ] && echo " $0 脚本使用帮助信息: $0 [ arg1 arg2 ]"
[ "$#" -eq 2 ] && echo "$0 脚本正在执行......"
root@admina-virtual-machine:/data/scripts/python10# bash num2.sh 
num2.sh 脚本使用帮助信息: num2.sh [ arg1 arg2 ]
root@admina-virtual-machine:/data/scripts/python10# bash num2.sh 2
num2.sh 脚本使用帮助信息: num2.sh [ arg1 arg2 ]
root@admina-virtual-machine:/data/scripts/python10# bash num2.sh 2 2
num2.sh 脚本正在执行......
root@admina-virtual-machine:/data/scripts/python10# bash num2.sh 2 2 3
num2.sh 脚本使用帮助信息: num2.sh [ arg1 arg2 ]



字符串
== 两侧的内容是一致的
!= 两侧的内容是不一致的

使用场景:
root@admina-virtual-machine:/data/scripts/python10# cat str.sh 
#!/bin/bash
# 字符串表达式的演示
a="$1"
b="$2"


[ "${a}" == "${b}" ] && echo "您输入的两个参数内容是一致的"
[ "${a}" != "${b}" ] && echo "您输入的两个参数内容是不一致的"


root@admina-virtual-machine:/data/scripts/python10# bash str.sh abc abc
您输入的两个参数内容是一致的
root@admina-virtual-machine:/data/scripts/python10# bash str.sh abc abcd
您输入的两个参数内容是不一致的


3.5 shell 流程控制



3.5.1 简单流程控制


选择
python if语句格式:

python中的流程控制:

if语句:
单if语句:
if 条件:
执行语句

双if语句:
if 条件:
执行语句
else:
执行语句2

多if语句:
if 条件1:
执行语句1
elif 条件2:
执行语句2
else:
执行语句2

shell中的if
单if语句:
格式:
if 条件
then
执行语句
fi
重点:
首行关键字是if
末行关键字是fi
场景:
单一条件,只有一个输出


示例:
如果我输入内容是 nan
root@admina-virtual-machine:/data/scripts/python10# bash danif.sh nan
您的性别是 男
root@admina-virtual-machine:/data/scripts/python10# cat danif.sh 
#!/bin/bash
# 单if语句的使用场景
if [ "$1" == "nan" ]
then
  echo "您的性别是 男"
fi

双if语句:
格式:
if 条件
then
执行语句
else
执行语句2
fi

场景:
一个条件,两种结果

示例:
root@admina-virtual-machine:/data/scripts/python10# cat shuangif.sh 
#!/bin/bash
# 单if语句的使用场景
if [ "$1" == "nan" ]
then
  echo "您的性别是 男"
else
  echo "您的性别是 女"
fi
root@admina-virtual-machine:/data/scripts/python10# bash shuangif.sh nan
您的性别是 男
root@admina-virtual-machine:/data/scripts/python10# bash shuangif.sh nv
您的性别是 女
root@admina-virtual-machine:/data/scripts/python10# bash shuangif.sh nvdsaf
您的性别是 女

多if语句:
格式:
if 条件1
then
执行语句1
elif 条件2
then
执行语句2
else
执行语句3
fi


场景:
n个条件,n+1个结果

示例:
root@admina-virtual-machine:/data/scripts/python10# cat duoif.sh 
#!/bin/bash
# 单if语句的使用场景
if [ "$1" == "nan" ]
then
  echo "您的性别是 男"
elif [ "$1" == "nv" ]
then
  echo "您的性别是 女"
else
  echo "您的性别,我不知道"
fi
root@admina-virtual-machine:/data/scripts/python10# bash duoif.sh 
您的性别,我不知道
root@admina-virtual-machine:/data/scripts/python10# bash duoif.sh nan
您的性别是 男
root@admina-virtual-machine:/data/scripts/python10# bash duoif.sh nv
您的性别是 女
root@admina-virtual-machine:/data/scripts/python10# bash duoif.sh nvdsaf
您的性别,我不知道

场景:
服务的启动
需求:
start 启动
stop 关闭
restart 重启
* 脚本使用方式

root@admina-virtual-machine:/data/scripts/python10# cat if.sh 
#!/bin/bash
# 多if语句的使用场景
if [ "$1" == "start" ]
then
  echo "启动 $0 脚本"
elif [ "$1" == "stop" ]
then
  echo "关闭 $0 脚本"
elif [ "$1" == "restart" ]
then
  echo "重启 $0 脚本"
else
  echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
fi
root@admina-virtual-machine:/data/scripts/python10# bash if.sh 
if.sh 脚本的使用方式: if.sh [ start | stop | restart ]
root@admina-virtual-machine:/data/scripts/python10# bash if.sh start
启动 if.sh 脚本
root@admina-virtual-machine:/data/scripts/python10# bash if.sh stop
关闭 if.sh 脚本
root@admina-virtual-machine:/data/scripts/python10# bash if.sh restart
重启 if.sh 脚本

case语句
格式:
case 值 in
值1)
执行语句
;;
值1)
执行语句
;;
值1)
执行语句
;;
值1)
执行语句
;;
esac



场景:服务启动
root@admina-virtual-machine:/data/scripts/python10# cat case.sh 
#!/bin/bash
# case语句使用场景
case "$1" in
"start")
echo "启动 $0 脚本"
;;
"stop")
echo "关闭 $0 脚本"
;;
"restart")
echo "重启 $0 脚本"
;;
*)
echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
;;
esac
root@admina-virtual-machine:/data/scripts/python10# bash case.sh 
case.sh 脚本的使用方式: case.sh [ start | stop | restart ]
root@admina-virtual-machine:/data/scripts/python10# bash case.sh start
启动 case.sh 脚本
root@admina-virtual-machine:/data/scripts/python10# bash case.sh stop
关闭 case.sh 脚本
root@admina-virtual-machine:/data/scripts/python10# bash case.sh restart
重启 case.sh 脚本




循环
python格式:
for语句:
for 条件:
执行语句
while语句:
while 条件:
执行语句

until语句:
until 条件:
执行语句

shell的格式:
for 语句:
格式;
for 条件
do
执行语句
done

场景:
遍历列表

示例:遍历文件
root@admina-virtual-machine:/data/scripts/python10# ls
age.sh   danif.sh  file1.sh  nihao    num2.sh  select.sh    str.sh   weizhi.sh
case.sh  duoif.sh  if.sh     num1.sh  num.sh   shuangif.sh  test.sh  zhuangtai.sh

root@admina-virtual-machine:/data/scripts/python10# cat for.sh 
#!/bin/bash
# for语句的使用示例
file=`ls /data/scripts/python10`
for i in "${file}"
do
 echo "${i}"
done
root@admina-virtual-machine:/data/scripts/python10# bash for.sh 
age.sh
case.sh
danif.sh
duoif.sh
file1.sh
for.sh
if.sh
...


示例2:遍历数字
root@admina-virtual-machine:/data/scripts/python10# cat for1.sh 
#!/bin/bash
# for 语句示例2
num=$(seq 10)
for i in "${num}"
do
 echo "${i}"
done
root@admina-virtual-machine:/data/scripts/python10# bash for1.sh 
1
2
3
4
5
6
7
8
9
10

shell中的计算方法:
格式;
let 变量名a=变量名a+1
a=$((变量名a+1))

示例:
root@admina-virtual-machine:/data/scripts/python10# echo $a


root@admina-virtual-machine:/data/scripts/python10# a=1
root@admina-virtual-machine:/data/scripts/python10# let a=a+1
root@admina-virtual-machine:/data/scripts/python10# echo $a
2
root@admina-virtual-machine:/data/scripts/python10# a=$((a+1))
root@admina-virtual-machine:/data/scripts/python10# echo $a
3



while 语句:
格式;
while 条件
do
执行语句
done

场景:
如果条件满足,那么我一直循环下去

示例:
root@admina-virtual-machine:/data/scripts/python10# cat while.sh 
#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ] 
do
  echo "${a}"
  a=$((a+1))
done
root@admina-virtual-machine:/data/scripts/python10# bash while.sh 
1
2
3
4



until 语句:
格式;
until 条件
do
执行语句
done

场景:
如果条件不满足,那么我一直循环下去


示例:
root@admina-virtual-machine:/data/scripts/python10# cat until.sh 
#!/bin/bash
# until的示例
a=1
until [ "${a}" -gt 4 ] 
do
  echo "${a}"
  a=$((a+1))
done
root@admina-virtual-machine:/data/scripts/python10# bash until.sh 
1
2
3
4

3.5.2 复杂流程控制
python的函数
定义函数:
def 函数名():
函数体
调用
函数名()

传参数
def 函数名(参数):
函数体


调用传参数
函数名(参数)

shell函数格式:
定义函数:
函数名(){
函数体
}

调用函数:
函数名

传参数
函数名 参数

函数体调用参数:
函数名(){
函数体 $n
}
注意:
类似于shell内置变量中的位置参数

定义和调用函数示例:
root@admina-virtual-machine:/data/scripts/python10# bash fun2.sh 
wo de mingzi shi  111
root@admina-virtual-machine:/data/scripts/python10# cat fun2.sh 
#!/bin/bash
# 函数使用场景一:执行频繁的命令
dayin(){
 echo "wo de mingzi shi  111"
}
dayin

函数传参和函数体内调用参数的示例
root@admina-virtual-machine:/data/scripts/python10# bash fun4.sh 
wo de mingzi shi 111
root@admina-virtual-machine:/data/scripts/python10# cat fun4.sh 
#!/bin/bash
# 函数的使用场景二
dayin(){
 echo "wo de mingzi shi $1"
}
dayin 111

函数使用场景:
执行频繁的命令
或者
执行命令格式相近的命令

场景一:执行频繁的命令
root@admina-virtual-machine:/data/scripts/python10# bash fun1.sh 
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
root@admina-virtual-machine:/data/scripts/python10# cat fun1.sh 
#!/bin/bash
# 输出一大堆执行频繁的命令
echo "wo de mingzi shi  111"
echo "wo de mingzi shi  111"
echo "wo de mingzi shi  111"
echo "wo de mingzi shi  111"
echo "wo de mingzi shi  111"
echo "wo de mingzi shi  111"
echo "wo de mingzi shi  111"
echo "wo de mingzi shi  111"
echo "wo de mingzi shi  111"
echo "wo de mingzi shi  111"
函数演变一下
root@admina-virtual-machine:/data/scripts/python10# cat fun2.sh 
#!/bin/bash
# 函数使用场景一:执行频繁的命令
dayin(){
 echo "wo de mingzi shi  111"
}
dayin
dayin
dayin
dayin
dayin
dayin
root@admina-virtual-machine:/data/scripts/python10# bash fun2.sh 
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111
wo de mingzi shi  111

场景二;执行命令格式相近的命令
root@admina-virtual-machine:/data/scripts/python10# cat fun3.sh 
#!/bin/bash
# 输出格式相近的命令
echo "wo de mingzi shi  1a11"
echo "wo de mingzi shi  11d1"
echo "wo de mingzi shi  111d"
echo "wo de mingzi shi  111s"
echo "wo de mingzi shi  111a"
echo "wo de mingzi shi  111s"
echo "wo de mingzi shi  111s"
echo "wo de mingzi shi  111d"
echo "wo de mingzi shi  111f"
echo "wo de mingzi shi  111e"
root@admina-virtual-machine:/data/scripts/python10# bash fun3.sh 
wo de mingzi shi  1a11
wo de mingzi shi  11d1
wo de mingzi shi  111d
wo de mingzi shi  111s
wo de mingzi shi  111a
wo de mingzi shi  111s
wo de mingzi shi  111s
wo de mingzi shi  111d
wo de mingzi shi  111f
wo de mingzi shi  111e

函数演变
root@admina-virtual-machine:/data/scripts/python10# cat fun4.sh 
#!/bin/bash
# 函数的使用场景二
dayin(){
 echo "wo de mingzi shi $1"
}
dayin 111
root@admina-virtual-machine:/data/scripts/python10# vim fun4.sh 
root@admina-virtual-machine:/data/scripts/python10# bash fun4.sh 
wo de mingzi shi 111
wo de mingzi shi 111s
wo de mingzi shi 111d
wo de mingzi shi 111g
wo de mingzi shi 111d
root@admina-virtual-machine:/data/scripts/python10# cat fun4.sh 
#!/bin/bash
# 函数的使用场景二
dayin(){
 echo "wo de mingzi shi $1"
}
dayin 111
dayin 111s
dayin 111d
dayin 111g
dayin 111d

函数传参多个,函数体内调用示例
root@admina-virtual-machine:/data/scripts/python10# bash fun4.sh 
wo de mingzi shi 111
wo de mingzi shi df
wo de mingzi shi dfs
root@admina-virtual-machine:/data/scripts/python10# cat fun4.sh 
#!/bin/bash
# 函数的使用场景二
dayin(){
 echo "wo de mingzi shi $1"
 echo "wo de mingzi shi $2"
 echo "wo de mingzi shi $3"
}
dayin 111 df dfs


1、项目周期
1.1 项目周期
需求:
开发
开发经理拆分项目
1、人员
2、技术水平

组员:
项目的子模块

项目交给测试之前,需要项目的联调后,联调的时候,需要开发团队都在一起

测试
部署
运营

1.2 项目开发环境
个人开发环境
个人笔记本
公司配的电脑

特点:
环境是自己配的,团队中不同的个人开发环境可以不一样
代码版本、软件版本、工具....

工作内容:
项目的子模块,子功能

工作人员:
自己

最终目的:
领导安排的内容,完成
项目的子模块开发完成

公司开发环境
公司内部的服务器,
特点:
服务器环境和线上的服务器环境完全一致

工作内容:
项目子模块间的功能联调

工作人员
开发团队所有人

最终目的:
项目开发完成
项目调试完成


测试环境:
公司内部的服务器,
特点:
服务器环境和线上的服务器环境完全一致

工作内容:
找茬

工作人员
测试团队

最终目的:
保证项目功能完备


预发布环境:
公司线上服务器组中的一台,
特点:
服务器环境和线上的服务器环境完全一致

工作内容:
1、支付类型的特殊功能
2、数据压力测试
3、其他安全措施

工作人员
运维团队

最终目的:
保证项目功能完备


线上环境
公司线上服务器组


工作内容:
代码部署

工作人员
运维团队

最终目的:
保证项目功能完备



2、代码发布
2.1 什么是部署
部署什么?
代码 经过测试,功能完善,没有问题的代码
部署到哪里?
服务器 所有人都能访问的到的一台服务器(有公网IP)
阿里云、亚马逊、腾讯云、华为云、....
部署的效果
web网页对外展示


2.2 部署方式
手工发布代码 步行

干扰因素多
不安全

脚本发布代码 坐车

干扰因素少
安全




2.3 部署流程
获取代码

代码仓库
集中式的
svn
分布式的
git

公司的代码仓库:
私有仓库 gitlab
内部服务器。或者公网服务器

仓库权限
只有项目的开发人员才有权限,项目之外的人没有权限

代码权限:
开发、管理、查看

提交的方式:
代码版本号

打包代码:
目的:
减少传输文件数量
减小传输文件大小
增强传输速率

常见打包方式:
windows:
zip、rar...
linux:
tar、zip...

传输代码
传输方式:
有网情况下
git
ftp
scp
共享挂载 cp
rsync

没有网情况下
物理方式 
U盘或者硬盘


传输工具演示:
格式:
scp  要传输的文件 要放置的位置

将本地文件推送到远程主机
scp python10.tar.gz root@192.168.56.12:/root/
远程连接的用户@远程主机:远程主机的位置
将远程主机的文件拉取到本地
scp root@192.168.56.12:/root/python10.tar.gz ./



主机间免秘钥认证
1、生成秘钥对
ssh-keygen -t rsa
-t 指定秘钥的类型  
rsa 秘钥类型

秘钥目录:/root/.ssh/
私钥 id_rsa 钥匙
公钥 id_rsa.pub


2、编辑认证文件
root@admina-virtual-machine:~/.ssh# cat /root/.ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDdC36zf/x+K8BQx582r+uYx78NC6s24PljsnpL6mELJkcXEVvIQ49lWpeJJm58F9j73J3h342WeaW50HzkxvcZGOqdx/pOp6tphkqlIe3utnJlRYvhSmULGFMBC1C0dNWcU/igK28XYBe3Rwhzh43vb5cc2jh90Ef2iQTny2RzjT11B2pro02wGGdcPKRHQkVfHdCkPa1iFsL2YHuYDr8XPMCcfbLfNUUSugGq2VoqpmjdR+G1xXgoHnAucFUMwHVTeGXEDiqFd56fPeEHQ9cSeVAFiQeqKeiNLvjQ0LJCgIy4TEx1DTc//3ND9TQbCA6NZJt4zgNc19jqAdT/PVp root@admina-virtual-machine
注意:
认证文件内容和56.11机器的公钥文件内容一致
保证文件内容是一整行

3、编辑ssh配置文件
root@admina-virtual-machine:~/.ssh# cat /etc/ssh/sshd_config
...
AuthorizedKeysFile %h/.ssh/authorized_keys
注意:
直接取消该行的注释即可

4、配置文件生效
重启ssh服务
/etc/init.d/ssh restart

5、验证操作
ssh root@192.168.56.12


1和5是在56.11上操作
2-4是在56.12上操作

关闭应用
开启什么应用,就关闭什么应用

解压代码:
tar xf ...

放置代码
备份原文件
cp nihao nihao-`date +%Y%m%d%H%M%S`


放置新文件


注意:
两个文件的名称是一样的,只是内容不同
对整个应用项目来说,两个文件没有区别

时间戳效果:
年月日时分秒:date +%Y%m%d%H%M%S

年月日:date +%Y%m%d
时分秒:date +%H%M%S




时间戳生成示例:
root@admina-virtual-machine:~/.ssh# date +%D
09/28/17
root@admina-virtual-machine:~/.ssh# date +%F
2017-09-28
root@admina-virtual-machine:~/.ssh# date +%Y%m%d
20170928
root@admina-virtual-machine:~/.ssh# date +%T
03:06:30
root@admina-virtual-machine:~/.ssh# date +%H%M%S
030643
root@admina-virtual-machine:~/.ssh# date +%Y%m%d%H%M%S
20170928030742


开启应用
关闭什么应用就开启什么应用

检查
查看浏览器效果

ok


3、环境部署
3.1 准备工作
创建基本目录
root@admina-virtual-machine:/data# mkdir /data/{server,logs,backup,soft,virtual}
root@admina-virtual-machine:/data# ls /data/
backup  logs  scripts  server  soft  virtual
root@admina-virtual-machine:/data# mkdir /data/codes
查看
root@admina-virtual-machine:/data# tree -L 1 /data/ 
/data/
├── backup 备份
├── codes 代码
├── logs 日志
├── scripts 脚本
├── server 服务
├── soft 软件
└── virtual 虚拟环境
3.2 项目分析
需求:
部署一个环境,支持我们的django项目正常运行

分析:

2、python环境 --->  3、python虚拟环境
1、django环境部署
4、django软件安装
5、项目基本操作
6、应用基本操作
7、view和url配置
8、问题:只有本机能访问
9、方案代理---- 10、nginx
11、nginx实现代理
13、pcre软件安装
12、nginx软件安装
14、nginx基本操作
15、nginx代理的配置
16、目录结构
17、查看配置文件
18、找到对应的代理配置项
19、启动django
20、启动nginx
21、整个项目调试


3.2 python虚拟环境
3.2.1 软件安装
apt-get install python-virtualenv -y

3.2.2 虚拟环境基本操作
创建 
virtualenv -p /usr/bin/python2.7 venv
进入
source venv/bin/activate
退出
deactivate
删除
rm -rf venv


3.3 django环境部署
3.3.1 django软件安装
解压
cd /data/soft
tar xf Django。。。
查看
cd Django...
cat INSTALL or README
安装
python setup.py install

python类型软件的安装流程
普通:
解压   安装
特殊:
解压    编译 安装

编译:python setup.py build



3.3.2 django项目操作
创建
django-admin startproject hello






3.3.3 django应用操作
创建应用
python manager.py startapp test1
注册应用
hello/settings.py

INSTALL_APP = [
。。。
'test1',
]




3.3.4 view和url配置
view 配置文件生效
root@admina-virtual-machine:/data/soft# cat /data/server/hello/test1/views.py
from django.shortcuts import render
from django.http import HttpResponse


# Create your views here.


def hello(resquest):
  return HttpResponse("hello V1.0")


url文件配置
root@admina-virtual-machine:/data/soft# cat /data/server/hello/hello/urls.py
"""hello URL Configuration


The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
1. Add an import:  from my_app import views
2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
1. Add an import:  from other_app.views import Home
2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from test1.views import *


urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello/$', hello),
]


启动服务:
cd /data/server/hello
python  manager.py runserver



启动django
python manage.py runserver >> /dev/null 2>&1 &
关闭:
ps aux | grep python
kill 56491

问题:
django项目只能在本机查看

方案:
nginx、haproxy

优中选优
简单


3.4 nginx环境部署
3.4.1 pcre软件安装
解压
tar xf pcre...
查看帮助
cd pcre。。。
INSTALL 或者 README

配置
./configure

编译
make

安装
make install

linux中软件安装的一般流程
解压
tar
解压文件,获取真正的配置文件
配置
configure
根据默认的配置项或者更改配置项,生成编译配置文件(Makefile)
编译
make
根据 Makefile 内容,编译生成指定的软件所需要的所有文件
安装
make install
将编译生成的所有文件,转移到软件指定安装的目录下面
--prefix


3.4.2 nginx软件安装
解压
cd /data/soft/
tar xf nginx-1.10.2.tar.gz
配置
cd nginx-1.10.2/
./configure --prefix=/data/server/nginx --without-http_gzip_module

编译
make
安装
make install


3.4.3 nginx简单操作


检查
./sbin/nginx -t
开启
./sbin/nginx
关闭
./sbin/nginx -s stop

重载
./sbin/nginx -s reload



突发问题:
root@admina-virtual-machine:/data/server/nginx# ./sbin/nginx -t
./sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory


分析:
1、先看报错
2、思考,是否报错真实有效
分析: 谁错了

3、查找文件
全名找不到,我们使用正则
4、找到文件,我没有问题
nginx默认找库文件的路径有问题
5、解决



3.4.4 nginx代理django项目
nginx的目录结构
root@admina-virtual-machine:/data/server/nginx# tree -L 2 /data/server/nginx/
/data/server/nginx/
├── ...
├── conf 配置文件目录
│   ...
│   ├── nginx.conf 默认的配置文件
│   ...
├── ...
├── html 网页文件
│   ├── 50x.html
│   └── index.html
├── logs 日志目录
│   ├── access.log
│   └── error.log
├── ...
├── sbin 执行文件目录
│   └── nginx
├── ...

nginx配置文件介绍
全局配置段
http配置段
server配置段 项目或者应用
location配置段 url配置



需求:
127.0.0.1:8000/hello/


代理配置项
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}


编辑配置文件实现代理功能
配置内容
62: location /hello/ {
63: proxy_pass http://127.0.0.1:8000;
64: }

标准配置文件
root@admina-virtual-machine:/data/server/nginx# egrep -vn '#|^$' conf/nginx.conf
3:worker_processes  1;
12:events {
13:    worker_connections  1024;
14:}
17:http {
18:    include       mime.types;
19:    default_type  application/octet-stream;
27:    sendfile        on;
31:    keepalive_timeout  65;
35:    server {
36:        listen       80;
37:        server_name  localhost;
43:        location / {
44:            root   html;
45:            index  index.html index.htm;
46:        }
52:        error_page   500 502 503 504  /50x.html;
53:        location = /50x.html {
54:            root   html;
55:        }
62: location /hello/ {
63: proxy_pass http://127.0.0.1:8000;
64: }
81:    }
119:}

配置文件生效

3.5 调试


4、手工发布代码
需求:
手工方式部署代码
线上主机:56.11
代码仓库:56.12

方案:
获取代码
打包代码
传输代码
关闭应用
解压代码
放置代码
备份老文件
放置新文件
开启应用
检查


实践
获取代码
sed -i 's#1.0#1.1#' django/views.py 
sed -i 's#原内容#替换后内容#g' 文件
分隔符:# / @ 

打包代码
tar zcf django.tar.gz django
传输代码
scp root@192.168.56.12:/data/code/django.tar.gz ./
关闭应用
关闭nginx应用
/data/server/nginx/sbin/nginx -s stop

关闭django应用
根据端口查看进程号,
lsof -Pti :8000
杀死进程号
kill 56502

解压代码
cd /data/codes
tar xf django.tar.gz

放置代码
备份老文件
需求:备份的格式:
文件名-时间戳
时间戳:年月日时分秒
date +%Y%m%d%H%M%S

mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`

放置新文件
cd /data/codes
mv django/views.py /data/server/hello/test1/

开启应用
开启django应用
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1
deactivate

开启nginx应用
/data/server/nginx/sbin/nginx


检查
netstat -tnulp | grep :80


5、脚本发布代码
5.1 远程脚本编写
5.1.1 远程命令执行
56.11 让 56.12 执行命令
示例:
root@admina-virtual-machine:/data/server/hello# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0c:29:b7:e7:b7  
 inet addr:192.168.56.11  Bcast:192.168.56.255  Mask:255.255.255.0
 inet6 addr: fe80::20c:29ff:feb7:e7b7/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 RX packets:436193 errors:0 dropped:3 overruns:0 frame:0
 TX packets:232980 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000 
 RX bytes:549035735 (549.0 MB)  TX bytes:20894523 (20.8 MB)


lo        Link encap:Local Loopback  
 inet addr:127.0.0.1  Mask:255.0.0.0
 inet6 addr: ::1/128 Scope:Host
 UP LOOPBACK RUNNING  MTU:65536  Metric:1
 RX packets:1630 errors:0 dropped:0 overruns:0 frame:0
 TX packets:1630 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1 
 RX bytes:137717 (137.7 KB)  TX bytes:137717 (137.7 KB)


root@admina-virtual-machine:/data/server/hello# ssh root@192.168.56.12 "ifconfig"
eth0      Link encap:Ethernet  HWaddr 00:0c:29:f7:ca:d4  
 inet addr:192.168.56.12  Bcast:192.168.56.255  Mask:255.255.255.0
 inet6 addr: fe80::20c:29ff:fef7:cad4/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 RX packets:9732 errors:0 dropped:3 overruns:0 frame:0
 TX packets:6918 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000 
 RX bytes:884755 (884.7 KB)  TX bytes:822817 (822.8 KB)


lo        Link encap:Local Loopback  
 inet addr:127.0.0.1  Mask:255.0.0.0
 inet6 addr: ::1/128 Scope:Host
 UP LOOPBACK RUNNING  MTU:65536  Metric:1
 RX packets:306051 errors:0 dropped:0 overruns:0 frame:0
 TX packets:306051 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1 
 RX bytes:23417793 (23.4 MB)  TX bytes:23417793 (23.4 MB)

5.1.2 远程脚本编写
1、实现简单的功能--- 简单的命令罗列
root@admina-virtual-machine:/data/scripts# cat tar_code.sh 
#!/bin/bash
# 功能:打包代码
# 脚本名:tar_code.sh
# 作者:python 13期全体
# 版本:V 0.1
# 联系方式:长安街1号 太和殿旁边 中南海1号厅


cd /data/code
[ -f django.tar.gz ] && rm -f django.tar.gz
tar zcf django.tar.gz django

2、 脚本优化之 固定内容变量化
root@admina-virtual-machine:/data/scripts# cat tar_code.sh 
#!/bin/bash
# 功能:打包代码
# 脚本名:tar_code.sh
# 作者:python 13期全体
# 版本:V 0.2
# 联系方式:长安街1号 太和殿旁边 中南海1号厅


FILE='django.tar.gz'
CODE_DIR='/data/code'
CODE_PRO='django'

cd "${CODE_DIR}"
[ -f "${FILE}" ] && rm -f "${FILE}"
tar zcf "${FILE}" "${CODE_PRO}"

3、脚本优化之 功能函数化
root@admina-virtual-machine:/data/scripts# cat tar_code.sh 
#!/bin/bash
# 功能:打包代码
# 脚本名:tar_code.sh
# 作者:python 13期全体
# 版本:V 0.3
# 联系方式:长安街1号 太和殿旁边 中南海2号厅


FILE='django.tar.gz'
CODE_DIR='/data/code'
CODE_PRO='django'

code_tar(){
cd "${CODE_DIR}"
[ -f "${FILE}" ] && rm -f "${FILE}"
tar zcf "${FILE}" "${CODE_PRO}"
}
code_tar

5.2 部署脚本编写
5.2.1 脚本框架
需求:先将脚本所设计的所有业务流程跑通

方案:
使用函数来体现

脚本实施:
#!/bin/bash
# 功能:打包代码
# 脚本名:deploy.sh
# 作者:python 13期全体
# 版本:V 0.1
# 联系方式:长安街1号 太和殿旁边 国务院1号厅


# 打包代码
tar_code(){
echo "打包代码"
}


# 传输代码
scp_code(){
echo "传输代码"
}


# 关闭应用
serv_stop(){
echo "关闭nginx应用"
echo "关闭django应用"
}


# 解压代码
untar_code(){
echo "解压代码"
}


# 放置代码
fangzhi_code(){
echo "放置代码"
}


# 开启应用
serv_star(){
echo "开启django应用"
echo "开启nginx应用"
}


# 检查
check(){
echo "检查"
}


main(){
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
}


main



5.2.2 命令填空
需求:
在流程跑通的情况下,执行完整的代码部署过程

方案:
在流程框架中,填写执行没有任何问题的命令

脚本实施:

#!/bin/bash
# 功能:打包代码
# 脚本名:deploy.sh
# 作者:python 13期全体
# 版本:V 0.2
# 联系方式:长安街1号 太和殿旁边 国务院2号厅


# 打包代码
tar_code(){
echo "打包代码"
ssh root@192.168.56.12 "/bin/bash /data/scripts/tar_code.sh"
}


# 传输代码
scp_code(){
echo "传输代码"
cd /data/codes/
[ -f django.tar.gz ] && rm -f django.tar.gz
[ -d django ] && rm -rf django
scp root@192.168.56.12:/data/code/django.tar.gz ./
}


# 关闭应用
serv_stop(){
echo "关闭nginx应用"
/data/server/nginx/sbin/nginx -s stop
echo "关闭django应用"
kill `lsof -Pti :8000`
}


# 解压代码
untar_code(){
echo "解压代码"
cd /data/codes
tar xf django.tar.gz
}


# 放置代码
fangzhi_code(){
echo "备份原文件"
mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`
echo "放置新文件"
mv /data/codes/django/views.py /data/server/hello/test1/
}


# 开启应用
serv_star(){
echo "开启django应用"
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1 &
deactivate
echo "开启nginx应用"
/data/server/nginx/sbin/nginx
}


# 检查
check(){
echo "检查"
netstat -tnulp | grep :80
}


main(){
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
}


main


5.2.3 增加日志功能
需求:
1、追踪记录
2、数据说话

方案:
增加日志功能
1、日志文件
/data/logs/deploy.log
2、日志格式
日期 时间 脚本名称 步骤

日期:date +%F
时间:date +%T
脚本:$0

脚本实施:
#!/bin/bash
# 功能:打包代码
# 脚本名:deploy.sh
# 作者:python 13期全体
# 版本:V 0.3
# 联系方式:长安街1号 太和殿旁边 国务院3号厅


LOG_FILE='/data/logs/deploy.log'


# 增加日志功能
write_log(){
  log_date='date +%F'
  log_time='date +%T'
  buzhou="$1"
  
  echo "${log_date}  ${log_time}  $0  ${buzhou}" >> "${LOG_FILE}"
}


# 打包代码
tar_code(){
echo "打包代码"
ssh root@192.168.56.12 "/bin/bash /data/scripts/tar_code.sh"
write_log "打包代码"
}


# 传输代码
scp_code(){
echo "传输代码"
cd /data/codes/
[ -f django.tar.gz ] && rm -f django.tar.gz
[ -d django ] && rm -rf django
scp root@192.168.56.12:/data/code/django.tar.gz ./
write_log "传输代码"
}


# 关闭应用
serv_stop(){
echo "关闭nginx应用"
/data/server/nginx/sbin/nginx -s stop
write_log "关闭nginx应用"

echo "关闭django应用"
kill `lsof -Pti :8000`
write_log "关闭django应用"
}


# 解压代码
untar_code(){
echo "解压代码"
cd /data/codes
tar xf django.tar.gz
write_log "解压代码"
}


# 放置代码
fangzhi_code(){
echo "备份原文件"
mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`
write_log "备份原文件"

echo "放置新文件"
mv /data/codes/django/views.py /data/server/hello/test1/
write_log "放置新文件"
}


# 开启应用
serv_star(){
echo "开启django应用"
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1 &
deactivate
write_log "开启django应用"

echo "开启nginx应用"
/data/server/nginx/sbin/nginx
write_log "开启nginx应用"
}


# 检查
check(){
echo "检查"
netstat -tnulp | grep :80
write_log "检查"
}


main(){
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
}


main

5.2.4 增加锁文件功能
需求:
同一时间段内,只允许有一个用户来执行这个脚本
如果脚本执行的时候,有人在执行,那么输入报错:改脚本正在运行......

设计:
锁文件 /tmp/deploy.pid
脚本执行的时候,需要创建锁文件
脚本执行结束的时候,需要删除锁文件

脚本实施
#!/bin/bash
# 功能:打包代码
# 脚本名:deploy.sh
# 作者:python 13期全体
# 版本:V 0.4
# 联系方式:长安街1号 太和殿旁边 国务院4号厅


LOG_FILE='/data/logs/deploy.log'


# 增加锁文件
add_lock(){
echo "增加锁文件"
touch /tmp/deploy.pid
write_log "增加锁文件"
}


# 删除锁文件
del_lock(){
echo "删除锁文件"
rm -f /tmp/deploy.pid
write_log "删除锁文件"
}


# 增加日志功能
write_log(){
  log_date='date +%F'
  log_time='date +%T'
  buzhou="$1"
  
  echo "${log_date}  ${log_time}  $0  ${buzhou}" >> "${LOG_FILE}"
}


# 打包代码
tar_code(){
echo "打包代码"
ssh root@192.168.56.12 "/bin/bash /data/scripts/tar_code.sh"
write_log "打包代码"
}


# 传输代码
scp_code(){
echo "传输代码"
cd /data/codes/
[ -f django.tar.gz ] && rm -f django.tar.gz
[ -d django ] && rm -rf django
scp root@192.168.56.12:/data/code/django.tar.gz ./
write_log "传输代码"
}


# 关闭应用
serv_stop(){
echo "关闭nginx应用"
/data/server/nginx/sbin/nginx -s stop
write_log "关闭nginx应用"

echo "关闭django应用"
kill `lsof -Pti :8000`
write_log "关闭django应用"
}


# 解压代码
untar_code(){
echo "解压代码"
cd /data/codes
tar xf django.tar.gz
write_log "解压代码"
}


# 放置代码
fangzhi_code(){
echo "备份原文件"
mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`
write_log "备份原文件"

echo "放置新文件"
mv /data/codes/django/views.py /data/server/hello/test1/
write_log "放置新文件"
}


# 开启应用
serv_star(){
echo "开启django应用"
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1 &
deactivate
write_log "开启django应用"

echo "开启nginx应用"
/data/server/nginx/sbin/nginx
write_log "开启nginx应用"
}


# 检查
check(){
echo "检查"
netstat -tnulp | grep :80
write_log "检查"
}


main(){
if [ -f /tmp/deploy.pid ]
then
echo "脚本 $0 正在运行中....."
exit
else
add_lock
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
del_lock
fi
}


main






5.2.5 脚本流程知识点填充
需求:
如果我给脚本出入的参数是deploy,那么我才执行
方案;
1、脚本的传参
2、位置参数的调用
3、case流程语句的使用

输出帮助信息:
脚本 $0 的使用方式: $0 [ deploy ]

脚本实施
#!/bin/bash
# 功能:打包代码
# 脚本名:deploy.sh
# 作者:python 13期全体
# 版本:V 0.5
# 联系方式:长安街1号 太和殿旁边 国务院5号厅


LOG_FILE='/data/logs/deploy.log'


# 脚本使用帮助
usage(){
echo "脚本 $0 的使用方式: $0 [ deploy ]"
exit
}


# 增加锁文件
add_lock(){
echo "增加锁文件"
touch /tmp/deploy.pid
write_log "增加锁文件"
}


# 删除锁文件
del_lock(){
echo "删除锁文件"
rm -f /tmp/deploy.pid
write_log "删除锁文件"
}


# 增加日志功能
write_log(){
  log_date='date +%F'
  log_time='date +%T'
  buzhou="$1"
  
  echo "${log_date}  ${log_time}  $0  ${buzhou}" >> "${LOG_FILE}"
}


# 打包代码
tar_code(){
echo "打包代码"
ssh root@192.168.56.12 "/bin/bash /data/scripts/tar_code.sh"
write_log "打包代码"
}


# 传输代码
scp_code(){
echo "传输代码"
cd /data/codes/
[ -f django.tar.gz ] && rm -f django.tar.gz
[ -d django ] && rm -rf django
scp root@192.168.56.12:/data/code/django.tar.gz ./
write_log "传输代码"
}


# 关闭应用
serv_stop(){
echo "关闭nginx应用"
/data/server/nginx/sbin/nginx -s stop
write_log "关闭nginx应用"

echo "关闭django应用"
kill `lsof -Pti :8000`
write_log "关闭django应用"
}


# 解压代码
untar_code(){
echo "解压代码"
cd /data/codes
tar xf django.tar.gz
write_log "解压代码"
}


# 放置代码
fangzhi_code(){
echo "备份原文件"
mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`
write_log "备份原文件"

echo "放置新文件"
mv /data/codes/django/views.py /data/server/hello/test1/
write_log "放置新文件"
}


# 开启应用
serv_star(){
echo "开启django应用"
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1 &
deactivate
write_log "开启django应用"

echo "开启nginx应用"
/data/server/nginx/sbin/nginx
write_log "开启nginx应用"
}


# 检查
check(){
echo "检查"
netstat -tnulp | grep :80
write_log "检查"
}


main(){
case "$1" in
"deploy")
if [ -f /tmp/deploy.pid ]
then
echo "脚本 $0 正在运行中....."
exit
else
add_lock
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
del_lock
fi
;;
*)
usage
;;
esac
}


main $1



5.2.6 输入参数安全优化
需求:
对脚本传入的参数进行判断,如果传入的参数数量不对,直接提示脚本使用方式,然后退出

方案:
条件表达式 + $# 

脚本实施
#!/bin/bash
# 功能:打包代码        
# 脚本名:deploy.sh     
# 作者:python 13期全体 
# 版本:V 0.6
# 联系方式:长安街1号 太和殿旁边 国务院6号厅


LOG_FILE='/data/logs/deploy.log'




# 脚本使用帮助
usage(){
echo "脚本 $0 的使用方式: $0 [ deploy ]"
exit
}


[ "$#" -eq 1 ] || usage
...



5.2.7 脚本调试功能

-x

示例:
root@admina-virtual-machine:/data/scripts/python10# bash -x while.sh 
+ a=1
+ '[' 1 -lt 5 ']'
+ echo 1
1
+ a=2
+ '[' 2 -lt 5 ']'
+ echo 2
2
+ a=3
+ '[' 3 -lt 5 ']'
+ echo 3
3
+ a=4
+ '[' 4 -lt 5 ']'
+ echo 4
4
+ a=5
+ '[' 5 -lt 5 ']'



5.3 生产脚本编写总结
5.3.1 简单脚本编写总结
1、命令简单罗列
2、固定的内容变量化
3、功能函数化


5.3.2 复杂脚本编写总结
1、手工执行的命令一定要正确
2、根据流程编写脚本的框架
3、将手工执行的命令填充到对应的框架函数内部
4、增加日志功能,方便跟踪脚本历史执行记录
5、增加锁文件,保证代码发布的过程中,不受同类脚本影响
6、主函数中逻辑流程控制好,
7、设计安全的方面:
输入参数数量
输入参数匹配
脚本帮助信息
8、调试脚本

注意事项:
1、命令一定要保证能正常执行
2、成对的符号,要成对写,避免丢失
3、函数调用,
写好函数后,一定要在主函数中进行调用
4、避免符号出现英文
5、命令变量的写法一定要规范
6、固定的内容一定要变量实现,方便以后更改
7、日志的输出
8、脚本的传参和函数的传参要区别对待
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 关于虹软人脸识别SDK的接入

    背景:虹软的人脸识别还是不错的,在官方注册一个账号,成为开发者,下载SDK的jar包,在开发者中心,找一个demo就可以开始做了,安装里边的逻辑,先看理解代码,然后就可以控制代码,完成自己想要的功能一:准备工作注意:1 sdk的下载,会给你4个jar包和4个秘钥以及1个appid,…...

    2024/4/30 19:44:00
  2. 根据UA获取用户访问操作系统、浏览器名

    功能需求统计用户通过何种浏览器访问系统、统计访问用户的操作系统。 依赖jar包<!-- https://mvnrepository.com/artifact/eu.bitwalker/UserAgentUtils --> <dependency><groupId>eu.bitwalker</groupId><artifactId>UserAgentUtils</artifa…...

    2024/4/30 19:55:24
  3. sharedpreferences

    这次作业是使用SharedPreferences将姓名和年龄信息保存到文件,然后再读取。 然后这就是界面的xml代码: JAVA代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mingzi =…...

    2024/4/12 8:24:46
  4. velocity的string转数字,numberTool

    velocity的string转数字,非常有意思: 1、通过java的包装类进行转换#set($intString = "20") #set($Integer = 0) $Integer.parseInt($intString) #set($tring = "20") #set($Double = 0.0) $Double.parseDouble($string)以上输出: 20 20.0注意:velocit…...

    2024/4/19 14:20:58
  5. windows系统中,关于有些数据库添加ODBC数据源时没有找到的问题

    楼主在windows系统中安装了Postgresql数据库,已经用了一段时间,当然连接方式是调用的别人的源码。后来想用erstudio来分析数据库的表结构与联系,需要设置数据源,结果竟然在系统数据源链接中没有发现postgresql数据库,比较奇怪。最后终于知道了答案:windows系统默认只支持…...

    2024/4/19 5:05:53
  6. C语言简单贪吃蛇源码(分数,暂停)

    上代码 运行环境 vscode g++,dev codeblock等可以运行。 没有用到数据结构和控制光标的函数。 #include <stdio.h> #include <time.h> #include <conio.h> #include <stdlib.h> #include <windows.h>#define N (20) #define M (20) #define L (N…...

    2024/4/12 8:24:40
  7. 简单说下H5+打包apk

    本文简单介绍一下项目写好之后 如何用H5+打包成apk,这里打包的不是上线的项目,而是测试用的。为什么要写这篇博文呢,本身懒,但朋友总是让我写打包步骤给他。 想到万一某天另外的朋友也让我写给他,岂不头疼。干脆就写这一博文,以防万一。。。。 1、首先要确保这个项目可运…...

    2024/4/30 20:01:50
  8. velocity 生成json对象数组

    2019独角兽企业重金招聘Python工程师标准>>> testData: [ #set($test = "") #foreach( $list in $velodata) $!flag { "id" :"$!{list.id}","name":"$!{list.name}","sexy":"$!{list.sexy}…...

    2024/4/30 22:58:01
  9. windows server 2003 ODBC数据源配置错误

    1、ODBC 数据源链接失败,错误 :STATE hy000, 不能产生SSPI上下文, 2、文件服务器,TCP/IP协议属性中,DNS没有填写,填入DNS即可解决。...

    2024/4/30 16:53:44
  10. C# 类和对象

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _0601_类和对象 {class Program{static void Main(string[] args){//非静态类必须通过实例化对象调用其内部的非静态成员//对象名.非静态成员…...

    2024/4/30 1:31:17
  11. bootstrap估计和bootstrap估计的Monte Carlo近似

    一般来说,bootstrap的程序很好理解。例如如果我们有大小为10的样本集S,我们可以计算样本均值。假如我们对这个均值估计的性质感兴趣,比如这个均值估计会有多大的方差,我们可以用bootstrap方法来获得估计。具体来说,我们多次对样本集进行有放回再抽样获得一系列的大小相同的…...

    2024/4/30 21:44:15
  12. C语言 贪吃蛇 命令行

    这是一个纯c语言写的贪吃蛇游戏 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<conio.h>#define SNAKE_LENGTH 100//定义蛇的最大长度 #define SCREEN_WIDETH 80 #define SCREEN_HEIGHT 30//定义每一节蛇…...

    2024/4/30 16:16:43
  13. Cydia substrate Hook 和模拟器安装

    http://blog.csdn.net/xbalien29/article/details/22661479 https://github.com/zencodex/cydia-android-hook http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1/总的来说,要学习还是建议Xposed毕竟是开源,要快速部署我还是比较推荐Cydiasubstrate,毕…...

    2024/4/30 23:00:12
  14. Velocity使用中存在的一些问题

    Velocity在模版数量非常多的情况下会导致内存泄漏,事实上Velocity在做模版缓存时,在文件系统中,一个为20-50kb模版文件,在内存中需要消耗3-5MB的内存,所以在模版过多的情况下对模版进行缓存会导致内存不足,在velocity1.5我们可以设定其缓存模版的数量,但是在模版数量多的…...

    2024/4/19 15:51:46
  15. GO语言:优雅地实现多重继承

    为什么80%的码农都做不了架构师?>>> 有些语言支持多重继承,但是如果多个父类存在相同的属性或方法,就会发生冲突,有些语言为了防止这种情况而只支持单继承,很明显就没有了复用多个父类的属性和方法的优势。 go语言其实没有对象的概念,只有结构体。 比如有一个…...

    2024/4/30 16:48:08
  16. win7 64位的数据源(ODBC)配置问题

    今天要连接Access时发现win7 64位旗舰版控制面板中管理工具下的数据源(ODBC)配置竟然只有SQLServer的驱动,其他的都没有了,这可不好玩!上网百度了一番,有人也遇过这样的问题,我在此猜测只有64位win7有这问题,解决办法:运行C:/Windows/SysWOW64下odbcad32.exe就可以正常添加各种…...

    2024/4/30 17:08:09
  17. C语言实现贪吃蛇(三)----结构+链表实现

    前言:本博客所讲到的知识跟前面我的两篇博客:《C语言实现贪吃蛇(一)—-数组实现》、《C语言实现贪吃蛇(二)—-局部刷新》 有很大的关系,建议大家前往看一下,尤其是第一篇,那篇博客是所有关于贪吃蛇游戏的基础。之前的两篇博客将运用的C语言知识限定在了一般的数组上,…...

    2024/4/21 1:11:49
  18. PBRT_V2 总结记录 Monte Carlo Integration

    1.PrepareIt states(陈述) that the expected value(期望值) of a function of a random variable f(X) can be defined as:Where PX is the probability distribution of the random variable X. This is hopefully something you understand well. (以上的公式在 《PBRT_V2 …...

    2024/4/15 9:03:10
  19. 中易云 易云系统 电镀废水处理远程监控解决方案

    一、需求分析随着电镀工业的快速发展和环保要求的日益提高,对电镀废水的处理要求越来越高,企业投入的成本以及设备保养维修费用也越来越大。如何在控制成本投入的情况下提高工作效率是电镀企业所需要面临的问题。中易云物联网科技有限公司针对电镀企业目前面临的困境,为其提…...

    2024/4/20 17:20:22
  20. C语言实现贪吃蛇步骤实述

    分析贪吃蛇整个游戏过程就是玩家控制蛇在限定区域内重复移动、吃食的过程,因此实现这个小游戏需要一条蛇、一个限定区域以及食物。我们可以用一个数组来表示限定区域,对这个区域而言,我们希望有初始化的方法以及在终端打印的方法;对于蛇来讲,我们希望可以对其初始化、移动以…...

    2024/4/20 18:30:58

最新文章

  1. 小米消金持续发力,全面强化金融消费者权益保护措施

    近年来&#xff0c;电信网络欺诈手段层出不穷&#xff0c;深度伪造等互联网技术被误用&#xff0c;导致欺诈行为更加隐蔽。重庆小米消费金融有限公司&#xff08;以下简称“小米消金”&#xff09;&#xff0c;作为一家持牌消费金融公司&#xff0c;深知保护消费者财产安全的重…...

    2024/5/1 2:06:59
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 数据挖掘中的PCA和KMeans:Airbnb房源案例研究

    目录 一、PCA简介 二、数据集概览 三、数据预处理步骤 四、PCA申请 五、KMeans 聚类 六、PCA成分分析 七、逆变换 八、质心分析 九、结论 十、深入探究 10.1 第 1 步&#xff1a;确定 PCA 组件的最佳数量 10.2 第 2 步&#xff1a;使用 9 个组件重做 PCA 10.3 解释 PCA 加载和特…...

    2024/4/30 3:39:10
  4. 3.java openCV4.x 入门-数据类型(CvType)与Scalar

    专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天 &#x1f9ed;文章导航&#x1f9ed; ⬆️ 2.hello openCV ⬇️ 4.待更新 数据类型&#xff…...

    2024/4/29 5:40:58
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57