shell自动化脚本优化诸位卧龙凤雏何以教我?

项目背景: 基于公司其他同事的脚本开发了一docker容器化部署的脚本 目前功能是实现了,但是脚本过于臃肿 如下图所示:

image.png
image.png
image.png
充斥着大量的 从外部文件获取值 set 变量值 使用sed 以及搭配 grep 替换的代码

这里优化了一下:

image.png

将检查基础配置  安装ntp 和定时任务 以及获取属性值和设置 以及各种sed 和函数封装到了不同的shell脚本中

目前基本可用

    source ./common/variable/variables_set.sh
    source ./common/function/functions.sh
    loopSetVariables "${hcs_all_settings_keys}"
    sh ./common/pre-module-set/setLinuxConfig.sh
    sh ./common/pre-module-set/installChrony.sh ${app_name}

问题就是

  1. 在主脚本中调用其他脚本文件 是用 source 还是 直接sh 比较好 有什么区别?
  2. 我在主脚本里面设置a=1 那么在子脚本中 可以直接 echo $a 显示值吗
  3. 我在子脚本b.sh 中set b=1 那么在主脚本中

    sh b.sh
    
    echo  $b  
    

    是否可以打印值?

阅读 1.7k
1 个回答
已解决,将sed设置值的地方使用`函数`来替代了 部分代码如下
# 循环获取配置文件中的变量值 设置到局部变量中
loopSetVariables() {
    local setting_arrs=("$@")
    for key in ${setting_arrs[*]}; do
        [ -z "${!key}"] && eval "export ${key}=$(cat ./${sef_name} | grep ${key} | cut -d '=' -f 2- | sed -e s/[[:space:]]//g -e 's/[]><\/$*.^[\\|]/\\&/g' -e 's/&/\\&/g')"
    done
    remove_trailing_slash "$INSTALL_PATH"
}

# 替换单个文件中的key
sedSingleFile() {
    declare -a myArray=($@)
    declare -i lennnnns=$#
    declare -i p1=$1
    declare -i p2=$(($lennnnns - $p1))
    for ((i = "$p2"; i < $lennnnns; i++)); do
        eval "pname=\${myArray[$i]}"
        for ((j = 1; j < $p2; j++)); do
            eval "kname=\${myArray[$j]}"
            eval "sed -i \"s${hcs_delimiter}{${kname}}${hcs_delimiter}\${$kname//&/\\\\&}${hcs_delimiter}g\" ${pname}"
        done
    done
}

# 替换指定路径下的key  忽略指定文件 匹配指定文件
sedMultiFile() {
    local multiLatstparam=${@: -1}
    local -i NBA=1
    for keyword in $@; do
        if [[ ${NBA} -eq ${#@} ]]; then
            echo
        else
            ((NBA++))
            eval "$keyword=\${$keyword//\\\\/\\\\\\\\};grep {${keyword}} -rl ${multiLatstparam} --exclude-dir={bin,lib,bundles,ntp,logs} --exclude={*.jar,*.war,*.gz,*.tar} | grep -E '(server.xml$|*.yml$|*.yaml$|index.html|*.properties$|*.conf$|extapi-principals.json|.env$)' | xargs sed -i \"s${hcs_delimiter}{${keyword}}${hcs_delimiter}\${$keyword//&/\\\\&}${hcs_delimiter}g\" >/dev/null 2>&1"
        fi
    done
}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题