参考:cShell脚本模板_运维@小兵的博客-CSDN博客
#!/bin/bash
set -e #打开异常退出功能
# set -x #打开Debug功能
######################定义变量######################
source /etc/profile #避免用contab、ansible、Jenkins执行shell脚本出现环境变量不对的问题
WORKDIR="$(cd $(dirname "$0") || exit 1;pwd)" #脚本所在路径
echo "Current Excute: bash ${WORKDIR}/$0 $@"
function_dir=${WORKDIR}/myfunction.lib
#创建日志文件
if [[ ! -d ${WORKDIR}/logs ]];then
mkdir -p ${WORKDIR}/logs
else
rm -f ${WORKDIR}/logs/*.log
fi
[[ $UID -ne 0 ]] && echo "[ERROR] Please Use root Excute......" && exit 1
#输出信息
# ${FUNCNAME[0]代表当前函数名,$LINENO代表当前代码行号
echo "$(date "+%Y-%m-%d %T.%N")[ERROR ${FUNCNAME[0]}:$LINENO] Invalid Param"
echo "$(date "+%Y-%m-%d %T.%N")[INFO]:Install Success"
#加载函数库
if [[ -f "$function_dir" ]];then
source $function_dir
else
echo -e "\033[31m函数库不存在\033[0m"
exit 71
fi
######################功能函数######################
#检查环境
Check_Env() {
echo "[INFO] Begin Check_Env..."
[[ $UID -ne 0 ]] && echo "[ERROR] Please Use Admin(root) Excute......" && exit 1
#检查命令是否存在
for cmd_bin in curl mvn
do
if ! command -v ${cmd_bin} &> /dev/null;then
echo "[ERROR] ${cmd_bin} command Not Exist" && exit 1
fi
done
echo "[INFO] Check_Env Success"
}
#帮助信息
Help() {
cat << EOF
Usage:
=======================================================================
optional arguments:
-h 提供帮助信息
-num 虚拟机编号
EXAMPLE:
bash $0 -num 10 web1 eth0 192.168.4.1/24
EOF
}
#######################主函数#######################
#参数校验
[[ $# -ne 1 ]] && echo "[ERROR] Invalid Param!!! eg:bash $0 ansible_path" && exit 1
[[ $# -le 5 ]] && echo "[ERROR] Invalid Param!!!,Please Excute:bash $0 -h" && exit 1
#主函数
main() {
Print
cecho 32 "开始执行......"
echo "1.本地源"
echo "2.网络源"
read -p "请选择:" choice
case ${choice} in
1)
Conf_Apt;;
2)
echo "1.ubuntu14.04"
echo "2.ubuntu16.04"
echo "3.ubuntu18.04"
read -p "请选择系统版本:" choice
case ${choice} in
1)
Conf_Ubuntu14.04;;
2)
Conf_Ubuntu16.04;;
3)
Conf_Ubuntu18.04;;
*)
cecho 31 "Invalid option!"
esac
;;
*)
cecho 31 "Invalid option!"
esac
}
main
if [[ $# -eq 0 ]];then
Excute_All
elif [[ "$1" == "-c" -a "$#" -eq 2 ]];then
case $2 in
system)
Init_System;;
*)
cecho 31 "Invalid option:bash `basename $0` [-h]"
esac
elif [[ "$1" == "-h" ]];then
Help
else
Help && exit 1
fi
#读取短参数
[[ $# -eq 0 ]] && HELP
while getopts :hnum::a: ARGS
do
case $ARGS in
h)
HELP;;
nu|m)
Name=rh7_node$OPTARG;;
\?)
cecho 31 "Invalid option:bash `basename $0` [-h]"
esac
done
启动行参数解析
使用getopts进行参数解析
- 如果一个字母后面有一个":",表示该命令行选项后面要跟一个参数。
- 如optsting写成"b:o:h",表示支持-b、-o、-h选项识别,-b和-o选项后面需要跟一个参数
- 输出-b 但是又没有指定参数,就走到这里 :)
while getopts "b:o:h" opt_name
do
case $opt_name in
b) echo "-b Option is recognized, argument=$OPTARG"
build
;;
o) echo "-o Option is recognized, argument=$OPTARG"
update $OPTARG
;;
h) echo "-h Option is recognized"
package
;;
:) echo "$OPTARG Option need a argument" # 比如输出-b 但是又没有指定参数,就走到这里
print_help
;;
esac
done
参数调用
function build()
{
echo "building ..."
}
build
function update()
{
update_mode=$1
# “STRING” 的长度为零则为真
if [ -z "${update_mode}" ]
then
echo ">> ERROR: build mode required."
return 1
fi
if [[ ${update_mode} != "release" ]] && [[ ${update_mode} != "debug" ]]
then
echo ">> ERROR: invalid build mode: ${update_mode}"
return 1
fi
if [ ${update_mode} == "release" ]
then
echo ">>>> relese update mode ..."
fi
if [ ${update_mode} == "debug" ]
then
echo ">>>> debug update mode ..."
fi
return 0
}
update debug
执行shell命令
function build_svr() {
core=$(grep -c ^processor /proc/cpuinfo)
echo ${core}
res=$(make svr)
if [ $? != 0 ]
then
echo "build svr fail"
fi
echo "build svr successfully"
echo ${res}
}
文本比较
function update() {
update_mode=$1
# # “STRING” 的长度为零则为真
if [ -z "${update_mode}" ]
then
echo ">> ERROR: build mode required."
return 1
fi
if [[ ${update_mode} != "release" ]] && [[ ${update_mode} != "debug" ]]
then
echo ">> ERROR: invalid build mode: ${update_mode}"
return 1
fi
if [ ${update_mode} == "release" ]
then
echo ">>>> relese update mode ..."
fi
if [ ${update_mode} == "debug" ]
then
echo ">>>> debug update mode ..."
fi
return 0
}
获得脚本的路径和脚本名称
SCRIPT_DIR="$(cd `dirname $0`; pwd)"
SCRIPT_NAME=$(basename $0)
OUTPUT_PATH=${SCRIPT_DIR}/data
function show_path() {
echo ${SCRIPT_DIR}
echo ${SCRIPT_NAME}
cd ${OUTPUT_PATH}
echo "hello" > 1.log
cd ${SCRIPT_DIR}
}
show_path
从代码仓库里面拉取代码
function svn_checkout() {
if [ ! -d ${OUTPUT_PATH} ]
then
mkdir ${OUTPUT_PATH}
echo "create dir"
fi
echo "dir created"
rm -rf ${OUTPUT_PATH}
cd ${OUTPUT_PATH}
svn checkout ${SVN_URL} . --username ${USERNAME} --password ${PASSWORD}
cd ${SCRIPT_DIR}
}
读取配置ini文件
SCRIPT_DIR="$(cd `dirname $0`; pwd)"
SCRIPT_NAME=`basename $0`
OUTPUT_PATH=${SCRIPT_DIR}/data
SHELL_CFG=${SCRIPT_DIR}/cfg.ini
function load_cfg() {
if [ -f "${SHELL_CFG}" ]
then
source ${SHELL_CFG}
fi
echo ${OUTPUT_CFG_PATH}
}
load_cfg
echo ${OUTPUT_CFG_PATH}
对应的ini文件(cfg.ini)
OUTPUT_CFG_PATH=./data
打印时间
print_date() {
echo "========date========"
date
}
输出重定向
LOG_FILE="build.log"
ERR_FILE="build.err"
TEE="/usr/bin/tee"
set_env() {
if [ ${SILENT} == 'true' ]
then
exec 1>${LOG_FILE}
exec 2>${ERR_FILE}
else
NPIPE=/tmp/$$.tmp
trap "rm -f ${NPIPE}" EXIT
mknod $NPIPE p
${TEE} <$NPIPE ${LOG_FILE} &
exec 1>&- # &- 关闭标准输出 # n&- 表示将 n 号输出关闭
exec 1>$NPIPE
exec 2>${ERR_FILE}
fi
}
脚本debug
脚本debug神器,把每一行的脚本执行了什么都打印出来
#!/bin/sh -x
作者:DayDayUpppppp
链接:https://www.jianshu.com/p/34c76024c0ef
vim自动给shell文件添加文件头
修改文件 /etc/vimrc
追加到末尾就好
set ignorecase
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1, "#!/bin/bash")
call setline(2,"##############################################################")
call setline(3, "# File Name:".expand("%"))
call setline(4, "# Version:V1.0")
call setline(5, "# Author:quanheng")
call setline(6, "# Organization:www.quanheng77.top")
call setline(7, "# Desc:")
call setline(8,"##############################################################")
endif
endfunc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)