From 2b1b9c00b904d607064ed5865aa70d956a3c820a Mon Sep 17 00:00:00 2001 From: "Walter.Kolczynski" Date: Wed, 2 Nov 2022 18:26:34 +0000 Subject: [PATCH] Correct syntax in remaining sorc scripts Updates remaining shell scripts in sorc directory to pass shellcheck without any warnings. Refs: #397 --- sorc/checkout.sh | 21 ++++---- sorc/link_workflow.sh | 52 +++++++++--------- sorc/ncl.setup | 6 +-- sorc/partial_build.sh | 119 ++++++++++++++++++++++-------------------- 4 files changed, 102 insertions(+), 96 deletions(-) diff --git a/sorc/checkout.sh b/sorc/checkout.sh index d414bbaade6..dc58f192532 100755 --- a/sorc/checkout.sh +++ b/sorc/checkout.sh @@ -10,7 +10,7 @@ Clones and checks out external components necessary for cloning and just check out the requested version (unless -c option is used). -Usage: $BASH_SOURCE [-c][-h][-m ufs_hash][-o] +Usage: ${BASH_SOURCE[0]} [-c][-h][-m ufs_hash][-o] -c: Create a fresh clone (delete existing directories) -h: @@ -51,7 +51,7 @@ function checkout() { remote="$2" version="$3" - name=$(echo ${dir} | cut -d '.' -f 1) + name=$(echo "${dir}" | cut -d '.' -f 1) echo "Performing checkout of ${name}" logfile="${logdir:-$(pwd)}/checkout_${name}.log" @@ -60,8 +60,8 @@ function checkout() { rm "${logfile}" fi - cd "${topdir}" - if [[ -d "${dir}" && $CLEAN == "YES" ]]; then + cd "${topdir}" || exit 1 + if [[ -d "${dir}" && ${CLEAN} == "YES" ]]; then echo "|-- Removing existing clone in ${dir}" rm -Rf "${dir}" fi @@ -74,10 +74,10 @@ function checkout() { echo return "${status}" fi - cd "${dir}" + cd "${dir}" || exit 1 else # Fetch any updates from server - cd "${dir}" + cd "${dir}" || exit 1 echo "|-- Fetching updates from ${remote}" git fetch fi @@ -131,7 +131,7 @@ while getopts ":chgum:o" option; do ;; m) echo "Received -m flag with argument, will check out ufs-weather-model hash ${OPTARG} instead of default" - ufs_model_hash=$OPTARG + ufs_model_hash=${OPTARG} ;; :) echo "option -${OPTARG} needs an argument" @@ -145,7 +145,8 @@ while getopts ":chgum:o" option; do done shift $((OPTIND-1)) -export topdir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd) +topdir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd) +export topdir export logdir="${topdir}/logs" mkdir -p "${logdir}" @@ -183,7 +184,7 @@ if [[ ${checkout_gtg} == "YES" ]]; then ################################################################################ echo "Checking out GTG extension for UPP" - cd "${topdir}/ufs_model.fd/FV3/upp" + cd "${topdir}/ufs_model.fd/FV3/upp" || exit 1 logfile="${logdir}/checkout_gtg.log" git -c submodule."post_gtg.fd".update=checkout submodule update --init --recursive >> "${logfile}" 2>&1 status=$? @@ -197,4 +198,4 @@ if (( errs > 0 )); then echo "WARNING: One or more errors encountered during checkout process, please check logs before building" fi echo -exit $errs +exit "${errs}" diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index 5395721a0cf..36dd448cb98 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -46,7 +46,7 @@ script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd) top_dir=$(cd "$(dirname "${script_dir}")" &> /dev/null && pwd) cd "${script_dir}" -COMPILER="intel" +export COMPILER="intel" # shellcheck disable=SC1091 source gfs_utils.fd/ush/detect_machine.sh # (sets MACHINE_ID) # shellcheck disable= @@ -80,8 +80,8 @@ fi [[ -d upp.fd ]] && rm -rf upp.fd ${LINK} ufs_model.fd/FV3/upp upp.fd -if [ ! -z "${FIX_DIR}" ]; then - if [ ! -d "${top_dir}/fix" ]; then mkdir "${top_dir}/fix" || exit 1; fi +if [[ -n "${FIX_DIR}" ]]; then + if [[ ! -d "${top_dir}/fix" ]]; then mkdir "${top_dir}/fix" || exit 1; fi fi cd "${top_dir}/fix" || exit 1 for dir in aer \ @@ -100,7 +100,7 @@ for dir in aer \ verif \ wave do - if [ -d "${dir}" ]; then + if [[ -d "${dir}" ]]; then [[ "${RUN_ENVIR}" == "nco" ]] && chmod -R 755 "${dir}" rm -rf "${dir}" fi @@ -108,7 +108,7 @@ for dir in aer \ ${LINK} "${FIX_DIR}/${dir}/${!fix_ver}" "${dir}" done -if [ -d "${script_dir}/ufs_utils.fd" ]; then +if [[ -d "${script_dir}/ufs_utils.fd" ]]; then cd "${script_dir}/ufs_utils.fd/fix" || exit 1 ./link_fixdirs.sh "${RUN_ENVIR}" "${machine}" 2> /dev/null fi @@ -118,7 +118,7 @@ fi #--add files from external repositories #--------------------------------------- cd "${top_dir}/parm" || exit 1 - if [ -d "${script_dir}/gldas.fd" ]; then + if [[ -d "${script_dir}/gldas.fd" ]]; then [[ -d gldas ]] && rm -rf gldas ${LINK} "${script_dir}/gldas.fd/parm" gldas fi @@ -146,7 +146,7 @@ cd "${top_dir}/ush" || exit 8 #----------------------------------- #--add gfs_wafs link if checked out -if [ -d "${script_dir}/gfs_wafs.fd" ]; then +if [[ -d "${script_dir}/gfs_wafs.fd" ]]; then #----------------------------------- cd "${top_dir}/jobs" || exit 1 ${LINK} "${script_dir}/gfs_wafs.fd/jobs"/* . @@ -166,7 +166,7 @@ fi #------------------------------ #--add GSI fix directory #------------------------------ -if [ -d "${script_dir}/gsi_enkf.fd" ]; then +if [[ -d "${script_dir}/gsi_enkf.fd" ]]; then cd "${top_dir}/fix" || exit 1 [[ -d gsi ]] && rm -rf gsi ${LINK} "${script_dir}/gsi_enkf.fd/fix" gsi @@ -175,12 +175,12 @@ fi #------------------------------ #--add GDASApp fix directory #------------------------------ -if [ -d "${script_dir}/gdas.cd" ]; then +if [[ -d "${script_dir}/gdas.cd" ]]; then cd "${top_dir}/fix" || exit 1 [[ ! -d gdas ]] && mkdir -p gdas cd gdas || exit 1 for gdas_sub in bump crtm fv3jedi gsibec; do - if [ -d "${gdas_sub}" ]; then + if [[ -d "${gdas_sub}" ]]; then rm -rf "${gdas_sub}" fi fix_ver="gdas_${gdas_sub}_ver" @@ -191,8 +191,8 @@ fi #------------------------------ #--add GDASApp files #------------------------------ -if [ -d "${script_dir}/gdas.cd" ]; then - cd "${top_dir}/ush" +if [[ -d "${script_dir}/gdas.cd" ]]; then + cd "${top_dir}/ush" || exit 1 ${LINK} "${script_dir}/gdas.cd/ush/ufsda" . fi @@ -200,7 +200,7 @@ fi #------------------------------ #--add DA Monitor file (NOTE: ensure to use correct version) #------------------------------ -if [ -d "${script_dir}/gsi_monitor.fd" ]; then +if [[ -d "${script_dir}/gsi_monitor.fd" ]]; then cd "${top_dir}/fix" || exit 1 [[ ! -d gdas ]] && ( mkdir -p gdas || exit 1 ) @@ -227,7 +227,7 @@ fi #--link executables #------------------------------ -if [ ! -d "${top_dir}/exec" ]; then mkdir "${top_dir}/exec" || exit 1 ; fi +if [[ ! -d "${top_dir}/exec" ]]; then mkdir "${top_dir}/exec" || exit 1 ; fi cd "${top_dir}/exec" || exit 1 for utilexe in fbwndgfs.x gaussian_sfcanl.x gfs_bufr.x regrid_nemsio.x supvit.x syndat_getjtbul.x \ @@ -243,7 +243,7 @@ ${LINK} "${script_dir}/ufs_model.fd/tests/ufs_model.x" . [[ -s "upp.x" ]] && rm -f upp.x ${LINK} "${script_dir}/upp.fd/exec/upp.x" . -if [ -d "${script_dir}/gfs_wafs.fd" ]; then +if [[ -d "${script_dir}/gfs_wafs.fd" ]]; then for wafsexe in \ wafs_awc_wafavn.x wafs_blending.x wafs_blending_0p25.x \ wafs_cnvgrib2.x wafs_gcip.x wafs_grib2_0p25.x \ @@ -260,7 +260,7 @@ for ufs_utilsexe in \ done # GSI -if [ -d "${script_dir}/gsi_enkf.fd" ]; then +if [[ -d "${script_dir}/gsi_enkf.fd" ]]; then for gsiexe in enkf.x gsi.x; do [[ -s "${gsiexe}" ]] && rm -f "${gsiexe}" ${LINK} "${script_dir}/gsi_enkf.fd/install/bin/${gsiexe}" . @@ -268,7 +268,7 @@ if [ -d "${script_dir}/gsi_enkf.fd" ]; then fi # GSI Utils -if [ -d "${script_dir}/gsi_utils.fd" ]; then +if [[ -d "${script_dir}/gsi_utils.fd" ]]; then for exe in calc_analysis.x calc_increment_ens_ncio.x calc_increment_ens.x \ getsfcensmeanp.x getsigensmeanp_smooth.x getsigensstatp.x \ interp_inc.x recentersigp.x;do @@ -278,7 +278,7 @@ if [ -d "${script_dir}/gsi_utils.fd" ]; then fi # GSI Monitor -if [ -d "${script_dir}/gsi_monitor.fd" ]; then +if [[ -d "${script_dir}/gsi_monitor.fd" ]]; then for exe in oznmon_horiz.x oznmon_time.x radmon_angle.x \ radmon_bcoef.x radmon_bcor.x radmon_time.x; do [[ -s "${exe}" ]] && rm -f "${exe}" @@ -286,7 +286,7 @@ if [ -d "${script_dir}/gsi_monitor.fd" ]; then done fi -if [ -d "${script_dir}/gldas.fd" ]; then +if [[ -d "${script_dir}/gldas.fd" ]]; then for gldasexe in gdas2gldas gldas2gdas gldas_forcing gldas_model gldas_post gldas_rst; do [[ -s "${gldasexe}" ]] && rm -f "${gldasexe}" ${LINK} "${script_dir}/gldas.fd/exec/${gldasexe}" . @@ -294,7 +294,7 @@ if [ -d "${script_dir}/gldas.fd" ]; then fi # GDASApp -if [ -d "${script_dir}/gdas.cd" ]; then +if [[ -d "${script_dir}/gdas.cd" ]]; then for gdasexe in fv3jedi_addincrement.x fv3jedi_diffstates.x fv3jedi_ensvariance.x fv3jedi_hofx.x \ fv3jedi_var.x fv3jedi_convertincrement.x fv3jedi_dirac.x fv3jedi_error_covariance_training.x \ fv3jedi_letkf.x fv3jedi_convertstate.x fv3jedi_eda.x fv3jedi_forecast.x fv3jedi_plot_field.x \ @@ -307,9 +307,9 @@ fi #------------------------------ #--link source code directories #------------------------------ -cd "${script_dir}" || exit 8 +cd "${script_dir}" || exit 8 - if [ -d gsi_enkf.fd ]; then + if [[ -d gsi_enkf.fd ]]; then [[ -d gsi.fd ]] && rm -rf gsi.fd ${SLINK} gsi_enkf.fd/src/gsi gsi.fd @@ -317,7 +317,7 @@ cd "${script_dir}" || exit 8 ${SLINK} gsi_enkf.fd/src/enkf enkf.fd fi - if [ -d gsi_utils.fd ]; then + if [[ -d gsi_utils.fd ]]; then [[ -d calc_analysis.fd ]] && rm -rf calc_analysis.fd ${SLINK} gsi_utils.fd/src/netcdf_io/calc_analysis.fd calc_analysis.fd @@ -343,7 +343,7 @@ cd "${script_dir}" || exit 8 ${SLINK} gsi_utils.fd/src/netcdf_io/interp_inc.fd interp_inc.fd fi - if [ -d gsi_monitor.fd ] ; then + if [[ -d gsi_monitor.fd ]] ; then [[ -d oznmon_horiz.fd ]] && rm -rf oznmon_horiz.fd ${SLINK} gsi_monitor.fd/src/Ozone_Monitor/nwprod/oznmon_shared/sorc/oznmon_horiz.fd oznmon_horiz.fd @@ -401,7 +401,7 @@ cd "${script_dir}" || exit 8 ${LINK} "gfs_utils.fd/src/${prog}" . done - if [ -d "${script_dir}/gfs_wafs.fd" ]; then + if [[ -d "${script_dir}/gfs_wafs.fd" ]]; then ${SLINK} gfs_wafs.fd/sorc/wafs_awc_wafavn.fd wafs_awc_wafavn.fd ${SLINK} gfs_wafs.fd/sorc/wafs_blending.fd wafs_blending.fd ${SLINK} gfs_wafs.fd/sorc/wafs_blending_0p25.fd wafs_blending_0p25.fd @@ -412,7 +412,7 @@ cd "${script_dir}" || exit 8 ${SLINK} gfs_wafs.fd/sorc/wafs_setmissing.fd wafs_setmissing.fd fi - if [ -d gldas.fd ]; then + if [[ -d gldas.fd ]]; then for prog in gdas2gldas.fd gldas2gdas.fd gldas_forcing.fd gldas_model.fd gldas_post.fd gldas_rst.fd ;do [[ -d "${prog}" ]] && rm -rf "${prog}" ${SLINK} "gldas.fd/sorc/${prog}" "${prog}" diff --git a/sorc/ncl.setup b/sorc/ncl.setup index de01309038c..b4981689db2 100644 --- a/sorc/ncl.setup +++ b/sorc/ncl.setup @@ -1,12 +1,12 @@ #!/bin/bash set +x -case $target in +case ${target} in 'jet'|'hera') module load ncl/6.5.0 - export NCARG_LIB=$NCARG_ROOT/lib + export NCARG_LIB=${NCARG_ROOT}/lib ;; *) - echo "[${BASH_SOURCE}]: unknown $target" + echo "[${BASH_SOURCE[0]}]: unknown ${target}" ;; esac diff --git a/sorc/partial_build.sh b/sorc/partial_build.sh index bc94674c5f2..0d4657136d5 100755 --- a/sorc/partial_build.sh +++ b/sorc/partial_build.sh @@ -8,7 +8,6 @@ declare -a Build_prg=("Build_ufs_model" \ "Build_gsi_utils" \ "Build_gsi_monitor" \ "Build_ww3_prepost" \ - "Build_reg2grb2" \ "Build_gdas" \ "Build_gldas" \ "Build_upp" \ @@ -31,7 +30,7 @@ parse_cfg() { [[ ${config,,} == "--verbose" ]] && config=$3 all_prg=() for (( n = num_args + 2; n <= total_args; n++ )); do - all_prg+=( ${!n} ) + all_prg+=( "${!n}" ) done if [[ ${config^^} == ALL ]]; then @@ -39,22 +38,26 @@ parse_cfg() { # set all values to true # for var in "${Build_prg[@]}"; do - eval "$var=true" + eval "${var}=true" done - elif [[ $config == config=* ]]; then + elif [[ ${config} == config=* ]]; then # # process config file # cfg_file=${config#config=} - $verbose && echo "INFO: settings in config file: $cfg_file" - while read cline; do + ${verbose} && echo "INFO: settings in config file: ${cfg_file}" + while read -r cline; do # remove leading white space clean_line="${cline#"${cline%%[![:space:]]*}"}" - ( [[ -z "$clean_line" ]] || [[ "${clean_line:0:1}" == "#" ]] ) || { - $verbose && echo $clean_line + { [[ -z "${clean_line}" ]] || [[ "${clean_line:0:1}" == "#" ]]; } || { + ${verbose} && echo "${clean_line}" first9=${clean_line:0:9} [[ ${first9,,} == "building " ]] && { - short_prg=$(sed -e 's/.*(\(.*\)).*/\1/' <<< "$clean_line") + # No shellcheck, this can't be replaced by a native bash substitute + # because it uses a regex + # shellcheck disable=SC2001 + short_prg=$(sed -e 's/.*(\(.*\)).*/\1/' <<< "${clean_line}") + # shellcheck disable= # remove trailing white space clean_line="${cline%"${cline##*[![:space:]]}"}" build_action=true @@ -63,27 +66,27 @@ parse_cfg() { last4=${clean_line: -4} [[ ${last4,,} == ". no" ]] && build_action=false found=false - for prg in ${all_prg[@]}; do - [[ $prg == "Build_"$short_prg ]] && { + for prg in "${all_prg[@]}"; do + [[ ${prg} == "Build_${short_prg}" ]] && { found=true - eval "$prg=$build_action" + eval "${prg}=${build_action}" break } done - $found || { - echo "*** Unrecognized line in config file \"$cfg_file\":" 2>&1 - echo "$cline" 2>&1 + ${found} || { + echo "*** Unrecognized line in config file \"${cfg_file}\":" 2>&1 + echo "${cline}" 2>&1 exit 3 } } } - done < $cfg_file - elif [[ $config == select=* ]]; then + done < "${cfg_file}" + elif [[ ${config} == select=* ]]; then # # set all values to (default) false # for var in "${Build_prg[@]}"; do - eval "$var=false" + eval "${var}=false" done # # read command line partial build setting @@ -91,43 +94,45 @@ parse_cfg() { del="" sel_prg=${config#select=} for separator in " " "," ";" ":" "/" "|"; do - [[ "${sel_prg/$separator}" == "$sel_prg" ]] || { - del=$separator - sel_prg=${sel_prg//$del/ } + [[ "${sel_prg/${separator}}" == "${sel_prg}" ]] || { + del=${separator} + sel_prg=${sel_prg//${del}/ } } done - [[ $del == "" ]] && { - short_prg=$sel_prg - found=false - for prg in ${all_prg[@]}; do - [[ $prg == "Build_"$short_prg ]] && { - found=true - eval "$prg=true" - break - } - done - $found || { - echo "*** Unrecognized program name \"$short_prg\" in command line" 2>&1 - exit 4 - } - } || { - for short_prg in $(echo ${sel_prg}); do + if [[ ${del} == "" ]]; then + { + short_prg=${sel_prg} found=false - for prg in ${all_prg[@]}; do - [[ $prg == "Build_"$short_prg ]] && { + for prg in "${all_prg[@]}"; do + [[ ${prg} == "Build_${short_prg}" ]] && { found=true - eval "$prg=true" + eval "${prg}=true" break } done - $found || { - echo "*** Unrecognized program name \"$short_prg\" in command line" 2>&1 - exit 5 + ${found} || { + echo "*** Unrecognized program name \"${short_prg}\" in command line" 2>&1 + exit 4 } - done - } + } || { + for short_prg in ${sel_prg}; do + found=false + for prg in "${all_prg[@]}"; do + [[ ${prg} == "Build_${short_prg}" ]] && { + found=true + eval "${prg}=true" + break + } + done + ${found} || { + echo "*** Unrecognized program name \"${short_prg}\" in command line" 2>&1 + exit 5 + } + done + } + fi else - echo "*** Unrecognized command line option \"$config\"" 2>&1 + echo "*** Unrecognized command line option \"${config}\"" 2>&1 exit 6 fi } @@ -135,7 +140,7 @@ parse_cfg() { usage() { cat << EOF 2>&1 -Usage: $BASH_SOURCE [-c config_file][-h][-v] +Usage: ${BASH_SOURCE[0]} [-c config_file][-h][-v] -h: Print this help message and exit -v: @@ -154,7 +159,7 @@ verbose=false config_file="gfs_build.cfg" # Reset option counter for when this script is sourced OPTIND=1 -while getopts ":c:hs:v" option; do +while getopts ":c:h:v" option; do case "${option}" in c) config_file="${OPTARG}";; h) usage;; @@ -162,12 +167,12 @@ while getopts ":c:hs:v" option; do verbose=true parse_argv+=( "--verbose" ) ;; - \?) - echo "[$BASH_SOURCE]: Unrecognized option: ${option}" + :) + echo "[${BASH_SOURCE[0]}]: ${option} requires an argument" usage ;; - :) - echo "[$BASH_SOURCE]: ${option} requires an argument" + *) + echo "[${BASH_SOURCE[0]}]: Unrecognized option: ${option}" usage ;; esac @@ -175,21 +180,21 @@ done shift $((OPTIND-1)) -parse_argv+=( "config=$config_file" ) +parse_argv+=( "config=${config_file}" ) # # call arguments retriever/config parser # -parse_cfg ${#parse_argv[@]} "${parse_argv[@]}" ${Build_prg[@]} +parse_cfg ${#parse_argv[@]} "${parse_argv[@]}" "${Build_prg[@]}" # # print values of build array # -$verbose && { +${verbose} && { echo "INFO: partial build settings:" for var in "${Build_prg[@]}"; do - echo -n " $var: " - ${!var} && echo True || echo False + echo -n " ${var}: " + "${!var}" && echo True || echo False done }