基本语法
注意:本文只是讲解部分语法,为了方便看懂下面的实战脚本,具体语法,建议仔细学习
1脚本格式
脚本以#!/bin/bash 开头(指定解析器)
2变量
基本语法
-
定义变量:变量名=变量值,注意,
=号前后不能有空格 -
撤销变量:unset 变量名
-
声明静态变量:readonly 变量,注意:
不能 unset
变量定义规则
-
变量不能以数字开头
-
等号两侧不能有空格
-
在 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包,可以写个脚本帮我们执行,我们程序员可以偷懒
实现思路
- 首先找到指定容器名的所有信息
- 停止容器
- 采用docker cp 命令替换容器内部的jar包
- 重新启动容器
代码如下
#!/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写的脚本,有空格这些换行符导致的无法执行,我们需要换行符转换一下,具体步骤如下
-
Git Bash:
-
打开 Git Bash 终端。
-
使用
dos2unix命令将脚本文件的换行符转换为 UNIX 格式
-
举例
dos2unix your_script.sh