解释器
#!/bin/bash
#!/bin/bash : 主要用于指定解释器
- Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件
- 通过 cat 命令来查看当前 Linux 系统的可用 Shell
- sh 是 UNIX 上的标准 shell,sh 是第一个流行的 Shell
- bash保持了对sh的兼容性,是各种 Linux 发行版默认配置的 shell
[root@localhost home]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
echo
用于字符串的输出
-e 开启转义
#!/bin/bash
echo -e "OK \n" # -e 开启转义 \n 换行 \c 不换行
echo "test"
变量
中间不能有空格,可以使用下划线 _
使用变量 需要加上$
{}
- $() 命令替换
CURRENT=$(pwd)
echo $CURRENT
////
/home
- ${} 变量替换(使用变量)
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
name=yangzhen # 可以不用引号
test=hello,${name} # {}加不加都一样
echo $test
////
hello,yangzhen
read
Linux read命令用于从标准输入读取数值。
-p 后面跟提示信息,即在输入前打印提示信息。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间
if read -t 5 -p "input website:" website
then
echo "your input is $website"
else
echo "timeOut"
fi
exit 0
-n 参数设置 read 命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量
case ... esac
该例子使用了-n 选项,后接数值 1,指示 read 命令只要接受到一个字符就退出。只要按下一个字符进行回答,read 命令立即接受输入并将其传给变量,无需按回车键。
case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。
read -n1 -p "Do you want to continue[Y/N]?" answer
case $answer in
Y | y)
echo "continue";;
N | n)
echo "bye";;
* )
echo "error";;
esac
exit 0
函数
function stop_docker()
{
echo "Try to stop container: $DOCKER_NAME..."
docker ps | grep -E "(${DOCKER_NAME})" | awk '{print $1}' | uniq | xargs -I {} docker stop {}
}
grep
grep 命令用于查找文件里符合条件的字符串
- -e 指定字符串做为查找文件内容的样式
- -E 将样式为延伸的正则表达式来使用
grep -E "(${DOCKER_NAME})"
grep -e "${DOCKER_NAME}"
awk
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
awk '{print $1}'
每行按空格或TAB分割,输出文本中的第1项
uniq
uniq 可检查文本文件中重复出现的行列并删除
xargs
给命令传递参数的一个过滤器
xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {}
执行过程
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc9690592571 xx.xx.xx.xx:31104/iiot/iiot-gateway:v2.16.0-nodel "/bin/sh ./start-gat…" 2 days ago Up 2 hours iiot-gateway-2.16.0
313f21aa1315 xx.xx.xx.xx:31104/iiot/iiot-gateway:v2.15.0 "/bin/sh ./start-gat…" 4 weeks ago Up 2 hours iiot-gateway
docker ps | grep -E "(iiot-gateway-2.16.0)"
fc9690592571 xx.xx.xx.xx:31104/iiot/iiot-gateway:v2.16.0-nodel "/bin/sh ./start-gat…" 2 days ago Up 2 hours iiot-gateway-2.16.0
docker ps | grep -E "({DOCKER_NAME})" | awk '{print 1}'
fc9690592571
docker ps | grep -E "({DOCKER_NAME})" | awk '{print 1}' | uniq
fc9690592571
docker ps | grep -E "({DOCKER_NAME})" | awk '{print 1}' | uniq | xargs -I {} docker stop {}
完成docker容器停止
完整网关脚本
#!/bin/bash
DOCKER_FILE=iiot-gateway.docker
DOCKER_NAME=iiot-gateway-2.16.0
CONFIG_PATH=$(pwd)
IMAGE_NAME=xx.xx.xx.xx:31104/iiot-gateway
IMAGE_VERSION=v2.16.0-nodel
VOLUME_PATH=$(pwd)/volumedata/gateway
HOST_NAME=$(hostname)
HARBOR_IMAGE_NAME=y2-harbor.xx.com:31104/iiot/iiot-gateway
HARBOR_IMAGE_VERSION=v2.16.0.0-nodel
#load docker image from harbor
function load_image_from_harbor()
{
echo "Try to pull docker image: $HARBOR_IMAGE_NAME:$HARBOR_IMAGE_VERSION ..."
docker pull ${HARBOR_IMAGE_NAME}:${HARBOR_IMAGE_VERSION}
echo "Re tag harbor image to: $IMAGE_NAME:$IMAGE_VERSION ..."
docker tag ${HARBOR_IMAGE_NAME}:${HARBOR_IMAGE_VERSION} ${IMAGE_NAME}:${IMAGE_VERSION}
echo "Del harbor image $HARBOR_IMAGE_NAME:$HARBOR_IMAGE_VERSION ..."
docker rmi ${HARBOR_IMAGE_NAME}:${HARBOR_IMAGE_VERSION}
echo "Save docker image file $CONFIG_PATH/files/gateway/$DOCKER_FILE..."
docker save -o ${CONFIG_PATH}/files/gateway/${DOCKER_FILE} ${IMAGE_NAME}:${IMAGE_VERSION}
}
#del container
function destory_docker()
{
stop_docker
echo "try to del container: $DOCKER_NAME..."
docker ps -a | grep -E "(${DOCKER_NAME})" | awk '{print $1}' | uniq | xargs -I {} docker rm --force {}
}
#stop container
function stop_docker()
{
echo "Try to stop container: $DOCKER_NAME..."
docker ps | grep -E "(${DOCKER_NAME})" | awk '{print $1}' | uniq | xargs -I {} docker stop {}
}
#restart container
function restart_docker()
{
echo "Try to restart container: $DOCKER_NAME..."
docker ps | grep -E "(${DOCKER_NAME})" | awk '{print $1}' | uniq | xargs -I {} docker restart {}
}
#del image
function destory_image()
{
# Stop Container
destory_docker
# Del image
echo "Try to del image: $IMAGE_NAME:$IMAGE_VERSION..."
docker images | grep -E "(${IMAGE_NAME}|${IMAGE_VERSION})" | awk '{print $3}' | uniq | xargs -I {} docker rmi {}
}
function load_image()
{
echo "loading image: $IMAGE_NAME:$IMAGE_VERSION..."
docker load -i ${CONFIG_PATH}/files/gateway/${DOCKER_FILE}
}
function build_container()
{
echo "$VOLUME_PATH root path is ${VOLUME_PATH}"
if [ ! -d ${VOLUME_PATH}/logs ];then
mkdir -p ${VOLUME_PATH}/logs
chmod -R 755 ${VOLUME_PATH}
chmod -R 777 ${VOLUME_PATH}/logs
fi
run_container
}
function run_container()
{
echo "docker run -d --net=host --restart=on-failure:10 --add-host=${HOST_NAME}:127.0.0.1 --mount type=bind,src=${CONFIG_PATH}/configs/gateway/config,dst=/thingsboard_gateway/config --mount type=bind,src=${CONFIG_PATH}/configs/gateway/data,dst=/thingsboard_gateway/data -v ${VOLUME_PATH}/logs:/logs --name ${DOCKER_NAME} ${IMAGE_NAME}:${IMAGE_VERSION}"
docker run -d --net=host --restart=on-failure:10 -p 5000:5000 --add-host=${HOST_NAME}:127.0.0.1 --mount type=bind,src=${CONFIG_PATH}/configs/gateway/config,dst=/thingsboard_gateway/config --mount type=bind,src=${CONFIG_PATH}/configs/gateway/data,dst=/thingsboard_gateway/data -v ${VOLUME_PATH}/logs:/logs --name ${DOCKER_NAME} ${IMAGE_NAME}:${IMAGE_VERSION}
}
echo -e ""
echo "Choose the command:"
echo "===================================================================================="
echo " [0] exit."
echo " [1] build: build & run the container & del the old container."
echo " [2] restart: restart the container."
echo " [3] build all: load image & run the container & del the old container and image."
echo " [4] del container: only destory the container."
echo " [5] del image: destory the image & the container."
echo " [6] load image: only load the image."
echo " [7] load image: load image from harbor"
echo "===================================================================================="
echo -e ""
while true
do
read -p "Please input your command number: " num
if [ ! -n "$num" ] ;then
echo "Please input the right number."
continue
elif [ $num -eq 0 ];then
exit
elif [ $num -eq 1 ];then
destory_docker
build_container
break
elif [ $num -eq 2 ];then
restart_docker
break
elif [ $num -eq 3 ];then
destory_image
load_image
build_container
break
elif [ $num -eq 4 ];then
destory_docker
break
elif [ $num -eq 5 ];then
destory_image
break
elif [ $num -eq 6 ];then
load_image
break
elif [ $num -eq 7 ]; then
load_image_from_harbor
break
fi
done