shell脚本是以 .sh 结尾的
# 新建一个脚本
vim shell_test.sh
shell脚本里面的内容要是可执行的
#! /bin/bash
123 # 这样的话无法执行
echo 'python' # 这样的话才能执行
#! /bin/bash 第一行必然以这个开头,第一行的 # 不算注释
# echo 'python' 从第二行开始, # 代表单行注释
# 下面的内容是多行注释
:<<!
要被注释的内容
!
# 多行注释也可以这么写,总是要保证一一对应
:<<a
要被注释的内容
a
最推荐的方式
/bin/bash 脚本文件名.sh
第二种方式,这种方式必须加可执行权限才能运行
# 先给脚本文件加上可执行权限,例如 chmod +x test.sh
# 然后在脚本文件所在的目录执行以下命令
./test.sh
第三种方式,不管加不加可执行方式都会执行,一般用的比较少,多用来加载脚本文件中的环境变量
source test.sh
1.shell脚本内容的第一行必然是 #! /bin/bash ,这个解释器的优先级最高
2.其次是执行的时候执行的解释器 例如 /bin/bash test.sh
3.最后才是 系统自带的默认的解释器版本,在终端中输入 echo $SHELL 可以查看默认的解释器版本
输入 cat /etc/shells , 可以查看所有的解释器版本
shell中的变量一共分为3种,本地 全局 内置变量
本地变量分为:普通变量和命令变量
普通变量
变量名=变量值
变量值必须是一个整体,不能包含特殊字符
$age # 先定义一个变量
age=19 # 然后对变量进行赋值
echo $age # 结果是 19
# 必须要是一个整体,不能有特殊字符,例如:
$age
age=19 abc
echo $age # 执行的时候就会报错,因为多了 空格
变量名=‘变量值’, 原字符输出,原来啥样,输入的就是啥样
$age
age='123 456' # ''里面的内容会原样输出
echo $age # 结果就是 123 456
变量名=“变量值”
先看变量值范围中有没有可以解析的变量,如果有,则先解析,然后整体赋值给新的变量名a,负责直接赋值 给变量名a
$age
age='123 456'
$name
name="mingwei $age" # 变量的值里面包含着另一个变量的名称,千万不要忘记加 $ 符
echo $name # 结果是 mingwei 123 456 ,先把包含的变量的名称解析执行后,再把整体结果赋值给name
命令变量
变量名=``
command=`pwd`
echo $command # 结果就是pwd命令被执行了
变量名=$(命令)
先执行命令,然后将执行完毕的结果交给新的变量名
user=$(whoami) # $(括号里面存放的是可执行命令)
echo $user
全局变量是在什么地方都能用的变量
查看系统中自带的全局变量
env
XDG_VTNR=7
LC_PAPER=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
XDG_SESSION_ID=c2
XDG_MENU_PREFIX=gnome-
SHELL=/bin/bash
QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
WINDOWID=60828225
LC_NUMERIC=en_US.UTF-8
UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session/1000/2050
GNOME_KEYRING_CONTROL=
GTK_MODULES=gail:atk-bridge:unity-gtk-module
NVM_DIR=/home/fengyehong/.nvm
USER=fengyehong
......
过滤出自己想要的变量
env | grep SHELL
结果是: SHELL=/bin/bash
定义一个全局变量
export 变量=值
export name=jiamingwei
env | grep name # 过滤出定义的name
# 结果是:
name=jiamingwei
查看定义的全局变量(共四种方法)
echo $name
echo "$name"
# 下面两种用的多一些
echo ${name}
echo "${name}"
变量的取消(对取消全局变量和本地变量都通用)
unset 变量名
unset name # 取消全局变量
unset age # 取消本地变量
$0 $n $ $# $?
$0 获取当前执行的shell脚本文件名
新建一个脚本文件,名称为 : get_shell_name.sh
内容为:
#! /bin/bash
# 获取当前脚本的名称
echo "当前脚本名称 :get_shell_name.sh"
echo "当前脚本名称 :$0"
/bin/bash get_shell_name.sh 去执行脚本
结果为:
echo "当前脚本名称 :get_shell_name.sh"
echo "当前脚本名称 :get_shell_name.sh"
用 mv get_shell_name.sh get_shell.sh 命令给脚本文件重命名,然后再重新执行脚本文件
# 结果为:
当前脚本名称 :get_shell_name.sh
当前脚本名称 :get_shell.sh
$n
获取当前执行的shell脚本的第n个参数值, n=1…9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来${10}
新建一个文件夹,名称为: get_args.sh
内容为:
#! /bin/bash
# 获取参数
echo "第1个位置的参数是:$1"
echo "第2个位置的参数是:$2"
echo "第3个位置的参数是:$3"
echo "第4个位置的参数是:$4"
用以下命令执行:
/bin/bash get_args.sh a b c d # 参数和参数之间用空格来空开
结果为:
第1个位置的参数是:a
第2个位置的参数是:b
第3个位置的参数是:c
第4个位置的参数是:d
$# 自动获取当前脚本参数的总的个数
新建一个脚本,名称为:get_args_num.sh
内容如下:
#! /bin/bash
# 获取当前脚本的参数的总个数
echo "当前脚本的总个数为:$#"
执行如下命令运行脚本
/bin/bash get_args_num.sh
因为没有添加参数,所以结果是: 当前脚本的总个数为:0
执行如下命令运行脚本
/bin/bash get_args_num.sh 1 2 3
因为添加了参数,所以结果为: 当前脚本的总个数为:3
$?
默认值相关
场景一:
变量a如果有内容,那么就输出a的变量值 变量a如果没有内容,那么就输出默认的内容
格式: ${变量名:-默认值}
场景二:
无论变量a是否有内容,都输出默认值
格式: ${变量名+默认值}
逻辑表达式一般用于判断多个条件之间的依赖关系。
常见的逻辑表达式有: && 和 ||
&& 的格式: 命令1 && 命令2
如果命令1执行了,命令2才执行,命令1不执行,命令2也不会执行
||的格式: 命令1 || 命令2
如果命令1没有执行,命令2才会执行,命令1执行了,命令2不会执行
n1 -eq n2 相等
n1 -gt n2 大于
n1 -lt n2 小于
n1 -ne n2 不等于
方式一: $ (( 计算表达式 )) 表达式范围内,空格不限制 $ 表达式种只能用±*/和()运算符,并且只能做整数运算
方式二: let 计算表达式 表达式必须是一个整体,中间不能出现空格等特殊字符
全部信息符号 2>&1
符号详解:
1 表示正确输出的信息
2 表示错误输出的信息
2>&1 代表所有输出的信息
新建一个文件,内容如下:
#! /bin/bash
# 测试2>&1的使用
echo "这是一条测试信息"
oaisoiwh
工作中启动Django
# 把执行效果放到file里面,同时在后台执行
python manager runserver >> file 2>&1 &
linux系统垃圾桶
/dev/null 是linux下的一个设备文件, 这个文件类似于一个垃圾桶,特点是:容量无限大
可以把一些无用信息放到里面,一旦放进去就收不回来了
# 例如有一些访问成功的200和访问失败之类的404的信息不想要,可以把这些信息放到垃圾桶里面
python manager runserver >>/dev/null 2>&1 &
小技巧
grep -nr 关键字 路径 # 从路径下,递归的查找所有符合条件的关键字
替换操作
样式一: sed -i ‘行号s#原内容#替换后内容#列号’ [文件名] # 行号不写,表示所有行,列号不写,表示第一个
样式二: sed -i ‘s#原内容#替换后内容#g’ [文件名] # g 表示指定行的所有匹配内容
增加操作
在指定行号的下一行增加内容
注意: 如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如 sed -i ‘1,3a\增加内容’ 文件名
删除操作
如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开,例如 sed -i ‘1,3d’ 文件名
awk是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件。
3.1 单分支if语句
格式和while格式基本一样
5.1 代码发布简介
5.1.1 代码发布介绍
发布:
代码 功能完善
服务器 公网IP,域名备案
效果 web+app
5.1.2 发布方式
手工
慢 干扰因素多 不安全
是脚本的基础
脚本
快,干扰因素少 安全
依赖手工发布代码
5.2 代码发布流程
5.2.1 流程简介
获取代码
因为发布
打包代码
代码量大,不好传输
传输代码
跨主机
关闭应用
避免对用户造成不好的干扰
解压代码
因为传输的是压缩包
放置代码
放新的代码
开启应用
刚才关闭了
内部检查
放置露脸
对外开放
5.2.2 流程详解
获取代码
代码仓库 代码权限
打包代码
tar
传输代码
scp
关闭应用
先近后远
先关nignx,再关django
解压代码
tar
放置代码
先备份。在放置新文件
开启应用
先远后近
先开启django,再开启nginx
内部检查
浏览器。端口、进程,等等
对外开放
技术的关键点
压缩格式: tar zcf 压缩后的文件名 要压缩的文件
tar zcf python12.tar.gz python12
解压缩格式: tar xf 要解压的文件名(后面什么都不写,默认解压到当前目录)
tar xf python12.tar.gz
查看压缩包内容: zcat 压缩后的文件名
zcat python12.tar.gz
格式: scp 要传输的文件 要传输到的位置
scp python12.tar.gz [email protected]:/home/python/Desktop # 传输到桌面文件夹,回车会要求输密码
拉取:要传输的文件是远程主机的,把远程主机的文件拉到本地
scp [email protected]:/tmp/python12.tar.gz /home/python/Desktop # 拉取到本地桌面文件夹
关键点: scp 传输文件是基于ssh协议来进行通信的 , 使用ssh登录的方式认证
时间戳
date +%F # 显示年月日 date +%T # 显示时分秒
date +%Y-%m-%d date +%H:%M:%S
备份文件,给一个文件加上时间戳
cp python12.tar.gz python12.tar.gz-$(date +%Y%m%d%H%M%S)
# 或
mv python12.tar.gz python12.tar.gz-$(date +%Y%m%d%H%M%S)
第一步 ssh-keygen -t rsa 生成密钥(公钥和私钥)
第三步 进入另一台主机,进入 隐藏的 .ssh文件夹,新建 authorized_keys文件,把公钥贴进去
注意,存放公钥的文件名称可以更改,但是后期需要修改系统的文件内容,不建议修改
然后就可以在另一台主机上免密码传输文件了.
还有一种办法
ssh-keygen -t rsa -p "" -N "" # 先生成密钥文件
ssh-copy-id -i .ssh/id_rsa.pub [email protected](表示把公钥文件直接传输到对方的主机上,之后就可以免密码使用了)
第一步: 安装虚拟环境软件
sudo apt-get install python-virtualenv -y
第二步: 创建好存放虚拟环境的目录,并且进入该目录指定python版本,并创建相应的虚拟环境
第三步: 进入虚拟环境中(原先的workon就是执行了source的脚本)
注意: 要先进入虚拟环境,下面的第一个图片安装实例有几个问题存在
1.没有进入虚拟环境安装,我们的Django框架是要安装在虚拟环境下的
2.需要在root用户下进行安装,否认会出现问题
第一步: 先普通用户模式转换为root用户模式
第二步: 再进入虚拟环境
第三步: 把Django安装包解压
第四步: 进入解压之后的目录,查看INSTALL文件中的内容,获取安装方法