Shell脚本入门

目录

  • 1.shell脚本基础知识
    • shell脚本的注释
    • shell脚本的执行方式
    • shell脚本解释器的优先级
    • shell中的变量
      • shell中的本地变量
      • SHELL中的全局变量
      • SHELL中的内置变量
    • 字符串精确截取
  • 2.shell进阶
    • 2.1 测试语句
    • 2.2 条件表达式
      • 2.2.1 逻辑表达式
      • 2.2.2 文件表达式
      • 2.2.3 数值操作符
      • 2.2.4 字符串之间的比较
    • 2.3 计算表达式
    • 2.4 linux的常见命令符号
      • & : 后台展示符号 &
      • grep命令
      • sed命令讲解
      • awk命令讲解
      • find命令
  • 3.流程控制
    • 3.2 双分支if语句
    • 3.3 多分支语句
    • 3.4 case选择语句
    • 3.5 for遍历的使用
    • 3.6 while循环的使用
    • 3.7 until语句的使用
  • 4.函数的使用
  • 5.代码的发布
    • 5.1 文件的压缩和解压缩
    • 5.2 scp 跨主机传输文件
    • 5.3 备份文件
  • 6.环境的部署
    • 6.1 两台主机间免密码认证
    • 6.2 另一种方式创建python虚拟环境
    • 6.3 传统方式安装Django框架(不是用pip 的方式)

1.shell脚本基础知识

shell脚本是以 .sh 结尾的

# 新建一个脚本
vim shell_test.sh

shell脚本里面的内容要是可执行的

#! /bin/bash
123  # 这样的话无法执行
echo 'python'  # 这样的话才能执行

shell脚本的注释

#! /bin/bash     第一行必然以这个开头,第一行的 # 不算注释
# echo 'python'  从第二行开始, # 代表单行注释

# 下面的内容是多行注释
:<<!
要被注释的内容
!

# 多行注释也可以这么写,总是要保证一一对应
:<<a
要被注释的内容
a

shell脚本的执行方式

最推荐的方式

/bin/bash 脚本文件名.sh

第二种方式,这种方式必须加可执行权限才能运行

# 先给脚本文件加上可执行权限,例如 chmod +x test.sh
# 然后在脚本文件所在的目录执行以下命令
./test.sh

第三种方式,不管加不加可执行方式都会执行,一般用的比较少,多用来加载脚本文件中的环境变量

source test.sh

shell脚本解释器的优先级

1.shell脚本内容的第一行必然是 #! /bin/bash ,这个解释器的优先级最高

2.其次是执行的时候执行的解释器 例如 /bin/bash test.sh

3.最后才是 系统自带的默认的解释器版本,在终端中输入 echo $SHELL 可以查看默认的解释器版本

输入 cat /etc/shells , 可以查看所有的解释器版本

shell中的变量

shell中的变量一共分为3种,本地 全局 内置变量

shell中的本地变量

本地变量分为:普通变量和命令变量

普通变量

变量名=变量值

变量值必须是一个整体,不能包含特殊字符

$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		

SHELL中的全局变量

全局变量是在什么地方都能用的变量

查看系统中自带的全局变量

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  # 取消本地变量

SHELL中的内置变量

$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

$?

获取上一条命令执行的结果,成功返回0,失败则返回非0
Shell脚本入门_第1张图片

字符串精确截取

格式: ${变量名:起始位置:截取长度}
Shell脚本入门_第2张图片

默认值相关

场景一:

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

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

新建一个脚本文件,内容如下:
在这里插入图片描述

执行脚本文件
在这里插入图片描述

场景二:

无论变量a是否有内容,都输出默认值  

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

新建一个脚本文件,内容如下:
在这里插入图片描述

执行脚本文件
在这里插入图片描述

2.shell进阶

2.1 测试语句

Shell脚本入门_第3张图片

2.2 条件表达式

2.2.1 逻辑表达式

逻辑表达式一般用于判断多个条件之间的依赖关系。

常见的逻辑表达式有: && 和 ||

&& 的格式: 命令1 && 命令2

如果命令1执行了,命令2才执行,命令1不执行,命令2也不会执行
在这里插入图片描述

||的格式: 命令1 || 命令2

如果命令1没有执行,命令2才会执行,命令1执行了,命令2不会执行
在这里插入图片描述

2.2.2 文件表达式

-f 判断输入内容是否是一个文件
Shell脚本入门_第4张图片

-d 判断输入内容是否是一个目录
在这里插入图片描述

-x 判断输入内容是否可执行
Shell脚本入门_第5张图片

2.2.3 数值操作符

n1 -eq n2 相等
n1 -gt n2 大于
n1 -lt n2 小于
n1 -ne n2 不等于
Shell脚本入门_第6张图片

2.2.4 字符串之间的比较

Shell脚本入门_第7张图片

2.3 计算表达式

方式一: $ (( 计算表达式 )) 表达式范围内,空格不限制 $ 表达式种只能用±*/和()运算符,并且只能做整数运算
Shell脚本入门_第8张图片

方式二: let 计算表达式 表达式必须是一个整体,中间不能出现空格等特殊字符
Shell脚本入门_第9张图片

2.4 linux的常见命令符号

& : 后台展示符号 &

就是将一个命令从前台转到后台执行
Shell脚本入门_第10张图片

全部信息符号 2>&1

符号详解:

1 表示正确输出的信息

2 表示错误输出的信息

2>&1 代表所有输出的信息

新建一个文件,内容如下:

#! /bin/bash
# 测试2>&1的使用
echo "这是一条测试信息"
oaisoiwh     

在终端执行以下命令:
Shell脚本入门_第11张图片

工作中启动Django

# 把执行效果放到file里面,同时在后台执行
python manager runserver >> file 2>&1 &

linux系统垃圾桶

/dev/null 是linux下的一个设备文件, 这个文件类似于一个垃圾桶,特点是:容量无限大

可以把一些无用信息放到里面,一旦放进去就收不回来了

# 例如有一些访问成功的200和访问失败之类的404的信息不想要,可以把这些信息放到垃圾桶里面
python manager runserver >>/dev/null 2>&1 &

grep命令

Shell脚本入门_第12张图片

小技巧

grep -nr 关键字 路径   # 从路径下,递归的查找所有符合条件的关键字

Shell脚本入门_第13张图片

sed命令讲解

替换操作

样式一: sed -i ‘行号s#原内容#替换后内容#列号’ [文件名] # 行号不写,表示所有行,列号不写,表示第一个
Shell脚本入门_第14张图片Shell脚本入门_第15张图片

样式二: sed -i ‘s#原内容#替换后内容#g’ [文件名] # g 表示指定行的所有匹配内容
Shell脚本入门_第16张图片

增加操作

在指定行号的下一行增加内容

格式: sed -i ‘行号a\增加的内容’ 文件名
Shell脚本入门_第17张图片

注意: 如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如 sed -i ‘1,3a\增加内容’ 文件名

在1到3行,每一行后面都增加内容
Shell脚本入门_第18张图片

删除操作

指定行号删除 格式: sed -i ‘行号d’ 文件名
Shell脚本入门_第19张图片

如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开,例如 sed -i ‘1,3d’ 文件名
Shell脚本入门_第20张图片

awk命令讲解

awk是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件。

命令格式: awk [参数] ‘[ 动作]’ [文件名]
Shell脚本入门_第21张图片

常见动作(适用于分隔符是空格的情况)
Shell脚本入门_第22张图片

NR的使用(适用于分隔符是空格的情况)
Shell脚本入门_第23张图片

BEGIN{OFS=" "} 来指定输出的分隔符号
Shell脚本入门_第24张图片

find命令

命令格式: find 路径 参数 关键字
Shell脚本入门_第25张图片

代码
Shell脚本入门_第26张图片

find过滤掉文件夹只留下文件
Shell脚本入门_第27张图片

3.流程控制

3.1 单分支if语句

3.2 双分支if语句

Shell脚本入门_第28张图片

代码演练
Shell脚本入门_第29张图片

3.3 多分支语句

Shell脚本入门_第30张图片

3.4 case选择语句

Shell脚本入门_第31张图片

代码实现
Shell脚本入门_第32张图片

case调用
Shell脚本入门_第33张图片

3.5 for遍历的使用

Shell脚本入门_第34张图片

代码实现:
Shell脚本入门_第35张图片

3.6 while循环的使用

Shell脚本入门_第36张图片

代码实现
Shell脚本入门_第37张图片

容易出现的错误
Shell脚本入门_第38张图片

3.7 until语句的使用

格式和while格式基本一样

代码实现
Shell脚本入门_第39张图片

4.函数的使用

格式:
Shell脚本入门_第40张图片

代码实现:
Shell脚本入门_第41张图片

5.代码的发布

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
		内部检查
			浏览器。端口、进程,等等
		对外开放

技术的关键点

5.1 文件的压缩和解压缩

压缩格式: tar zcf 压缩后的文件名 要压缩的文件

tar zcf python12.tar.gz   python12

解压缩格式: tar xf 要解压的文件名(后面什么都不写,默认解压到当前目录)

tar xf python12.tar.gz

查看压缩包内容: zcat 压缩后的文件名

zcat python12.tar.gz

5.2 scp 跨主机传输文件

格式: scp 要传输的文件 要传输到的位置

scp python12.tar.gz [email protected]:/home/python/Desktop   # 传输到桌面文件夹,回车会要求输密码

拉取:要传输的文件是远程主机的,把远程主机的文件拉到本地

scp [email protected]:/tmp/python12.tar.gz /home/python/Desktop  # 拉取到本地桌面文件夹

关键点: scp 传输文件是基于ssh协议来进行通信的 , 使用ssh登录的方式认证

5.3 备份文件

时间戳

date +%F # 显示年月日  date +%T # 显示时分秒
date +%Y-%m-%d       date +%H:%M:%S

Shell脚本入门_第42张图片

备份文件,给一个文件加上时间戳

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)

6.环境的部署

{ }的作用,创建多个文件夹
Shell脚本入门_第43张图片

{ }的作用,创建多个文件
Shell脚本入门_第44张图片

6.1 两台主机间免密码认证

第一步 ssh-keygen -t rsa 生成密钥(公钥和私钥)
Shell脚本入门_第45张图片

第二步 进入保存密钥的文件夹,把公钥的内容复制出来
Shell脚本入门_第46张图片

第三步 进入另一台主机,进入 隐藏的 .ssh文件夹,新建 authorized_keys文件,把公钥贴进去

注意,存放公钥的文件名称可以更改,但是后期需要修改系统的文件内容,不建议修改
Shell脚本入门_第47张图片

第四步 进入这个文件夹,修改配置文件
在这里插入图片描述
Shell脚本入门_第48张图片

第五步 重启服务
在这里插入图片描述

然后就可以在另一台主机上免密码传输文件了.

还有一种办法

ssh-keygen -t rsa -p "" -N ""  # 先生成密钥文件
ssh-copy-id -i .ssh/id_rsa.pub [email protected](表示把公钥文件直接传输到对方的主机上,之后就可以免密码使用了)

6.2 另一种方式创建python虚拟环境

第一步: 安装虚拟环境软件

sudo apt-get install python-virtualenv -y

第二步: 创建好存放虚拟环境的目录,并且进入该目录指定python版本,并创建相应的虚拟环境
Shell脚本入门_第49张图片

第三步: 进入虚拟环境中(原先的workon就是执行了source的脚本)
Shell脚本入门_第50张图片

6.3 传统方式安装Django框架(不是用pip 的方式)

注意: 要先进入虚拟环境,下面的第一个图片安装实例有几个问题存在

1.没有进入虚拟环境安装,我们的Django框架是要安装在虚拟环境下的

2.需要在root用户下进行安装,否认会出现问题

第一步: 先普通用户模式转换为root用户模式

第二步: 再进入虚拟环境

第三步: 把Django安装包解压

第四步: 进入解压之后的目录,查看INSTALL文件中的内容,获取安装方法

第五步: 执行安装命令, python setup.py install 根据情况可能会有前面加上sudo进行安装
Shell脚本入门_第51张图片

安装的正确姿势
Shell脚本入门_第52张图片

最终安装成功
在这里插入图片描述

你可能感兴趣的:(Linux,shell,linux)