shell脚本结构示例1

时间:2021-03-11 15:37:47

2013年以来自己因为偷懒,少写了很多东西,今年计划把以前积累的总结出来。

先从shell开始写起吧。

干了快3年游戏运维,期间经常会写一些shell本,不少脚本其实有很多可以复用的部分。

按照自己的风格,如果是比较重要的脚本,脚本内容可以分为3部分:输入部分、核心逻辑部分、输出部分。

本文主要介绍输入部分。

通常在现网运行的脚本,为了防止勿执行,最好带上参数,例如:

test.sh -w 1

而带参数的脚本写法如下,注释部分按个人风格书写即可:

#!/bin/bash
# creat by fank 2016-01-01
echo "===`date +"%F %T"`==" while getopts w: opt;do
case $opt in
w) w_list=${OPTARG};;
?) usage;;
esac
done

usage(){
echo "$0 -w [check_list]"
echo "$0 -w \"27-30\""
echo "$0 -w \"2,3,4\""
exit 1
}


echo $w_list

完成了带参数的输入,接下来可以进行参数解析或检查等操作。

实际过程中也经常可能遇到参数扩展的情况,比如输入-w '1-10',如何在脚本中把这个保存为一个包含1-10的数组呢:

function check_input(){
[[ -z $w_list ]]&& usage
w_list=${w_list//-/..}
w_tmp="echo {$w_list}"
list=$(eval $w_tmp)
list=$(echo $list|awk -F'{|}| ' '{for(i=1;i<=NF;i++)print $i }'|xargs)
for i in $list;do
[[ $((i+)) != $i ]] && tms_fail "Input worldID must be a number!"
done
echo "World set list is as follows:"
echo $list
echo "=="
}

在上面的代码中,对w_list变量(字符串)先进行了一次替换

 w_list=${w_list//-/..}

然后利用花括号扩展产生一个序列保存在新变量中

 w_tmp="echo {$w_list}"
list=$(eval $w_tmp)

其实这句代码,对-w '1,2,3' 这种输入也适用。