shell快速入门和基于docker发布的脚本案例

97 阅读2分钟

基本语法

注意:本文只是讲解部分语法,为了方便看懂下面的实战脚本,具体语法,建议仔细学习

1脚本格式

脚本以#!/bin/bash 开头(指定解析器)

2变量

基本语法

  1. 定义变量:变量名=变量值,注意,=号前后不能有空格

  2. 撤销变量:unset 变量名

  3. 声明静态变量:readonly 变量,注意:不能 unset

变量定义规则

  1. 变量不能以数字开头

  2. 等号两侧不能有空格

  3. 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算

举例

PROJECT_NAME=cqbb-wapi

如果要调用就是

$PROJECT_NAME

特殊变量

$?

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一 个命令正确执行; 如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明 上一个命令执行不正确了。)

运算符

基本语法

((运算式))”或“((运算式))**” 或 “**[运算式]

举例

查询指定容器名的docker容器信息

$(docker ps -aq --filter name=^/$PROJECT_NAME$)  

流程控制

if 判断

基本语法

注意事项: ①[ 条件判断式 ],中括号和条件判断式之间必须有空格 ②if 后要有空格

举例

if [ 条件判断式 ];then
 程序 
fi
或者 
if [ 条件判断式 ] 
then
 程序 
fi

实战举例

场景:每次docker发布,需要替换容器里面的jar包,可以写个脚本帮我们执行,我们程序员可以偷懒

实现思路

  1. 首先找到指定容器名的所有信息
  2. 停止容器
  3. 采用docker cp 命令替换容器内部的jar包
  4. 重新启动容器

代码如下

#!/bin/sh 
PROJECT_NAME=cqbb-wapi

# 找到正在运行的容器停止
CONTAINER_NAME=$(docker ps -aq --filter name=^/$PROJECT_NAME$)  
if [[ -n "$CONTAINER_NAME" ]]; then  
docker stop $CONTAINER_NAME;  
if [ $? != 0 ]
then
        echo "$PROJECT_NAME 停止失败....."  
else
        echo "$PROJECT_NAME 停止成功....."  
fi
echo "$PROJECT_NAME 停止成功....."  
fi  
  
sleep 3s


echo "将文件复制进容器"
docker cp /topevery/code/ty-cloud-control/app.jar  $CONTAINER_NAME:/
if [ $? != 0 ]
then
        echo "文件复制失败....."  
else
        echo "文件复制成功....."  
fi


echo "文件复制成功, 开始启动容器" 
docker start  $CONTAINER_NAME;
if [ $? != 0 ]
then
        echo "容器启动失败!"  
else
        echo "容器启动成功!"  
fi
echo "容器启动成功"

问题

我们执行脚本可能会遇到无法执行

问题解决

由于我是在windows写的脚本,有空格这些换行符导致的无法执行,我们需要换行符转换一下,具体步骤如下

  1. Git Bash:

    • 打开 Git Bash 终端。

    • 使用

      dos2unix
      

      命令将脚本文件的换行符转换为 UNIX 格式

举例

 dos2unix your_script.sh