$ in Groovy double quoted strings indicates the start of a placeholder, so you are expecting Groovy to supply the values for things like ${CURL_OPTS}. I suspect you want the shell environment to replace those. So you can either use the triple single quoted string (exactly what it is intended for) or you can escape each $, e.g. \$. The error is for expressions like $2 which isn't a valid Groovy variable name so not suitable for replacement.
On Tue, Mar 24, 2020 at 11:27 PM Dimitar Vassilev < dimitar.vassi...@gmail.com> wrote: > Greetings all, > Hope you are well and safe. I will need some pointers how to properly > escape the following piece of code into double quoted multi line shell step > ``` > #!/usr/bin/env bash > CURR_BL="foo_200227_203942" > HUB_URL="https://baz-baz.com:8045" > SEARCH_CSV_URL="${HUB_URL}/project_search.csv?query="${CURR_BL}"&scope=all" > CURL_OPTS="-s" > TTL_PRJ="$(curl "${CURL_OPTS}" ${SEARCH_CSV_URL} | awk -F , '{print $2}'| > wc -l)" > FIN_PRJ="$(curl "${CURL_OPTS}" ${SEARCH_CSV_URL} | awk -F , '{print $2}'| > grep Finished | wc -l)" > SUCC_RATE="$(awk -v succ_prj="${FIN_PRJ}" -v tl_prj="${TTL_PRJ}" 'BEGIN { > print int(( succ_prj / tl_prj )*100) }')" > LOG_PLACE="/foo/baz" > APPL_NAME="foobar" > CURR_VIEW="foo_200227_203942_seafood_int" > > cd "${LOG_PLACE}/${APPL_NAME}/${CURR_VIEW}"/; > cat "${LOG_PLACE}/${APPL_NAME}/${CURR_VIEW}"/.build_[0-9]*/*.err >> > "${CURR_VIEW}_err.log" > mail -a "${CURR_VIEW}_err.log" -s "Code quality build stats and error logs > attached for ${CURR_VIEW}" m...@me.em << EOF > ================Printing Code quality build stats:================== > Total projects for ${CURR_BL} is: ${TTL_PRJ} > Finished projects for ${CURR_BL} is: ${FIN_PRJ} > Success rate in percentage is: ${SUCC_RATE} > EOF > ``` > When running the above script as Jenkins shell step with """ I get the > error > illegal string body character after dollar sign; > solution: either escape a literal dollar sign "\$5" or > bracket the value expression "${5}" @ line 13, column 86. > earch.csv?query="${CURR_BL}"&scope=a > > Sample code with the error trigger is included > ``` > pipeline { > agent {label 'baz'} > stages { > stage('Test') { > steps { > script{ > sh"""#!/usr/bin/env bash > CURR_BL="foo_200227_203942" > HUB_URL="https://baz-baz.com:8045" > > SEARCH_CSV_URL="${HUB_URL}/project_search.csv?query="${CURR_BL}"&scope=all" > CURL_OPTS="-s" > TTL_PRJ="$(curl "${CURL_OPTS}" ${SEARCH_CSV_URL} | awk > -F , '{print $2}'| wc -l)" > FIN_PRJ="$(curl "${CURL_OPTS}" ${SEARCH_CSV_URL} | awk > -F , '{print $2}'| grep Finished | wc -l)" > SUCC_RATE="$(awk -v succ_prj="${FIN_PRJ}" -v > tl_prj="${TTL_PRJ}" 'BEGIN { print int(( succ_prj / tl_prj )*100) }')" > LOG_PLACE="/foo/baz" > APPL_NAME="foobar" > CURR_VIEW="foo_200227_203942_seafood_int" > cd "${LOG_PLACE}/${APPL_NAME}/${CURR_VIEW}"/; > cat > "${LOG_PLACE}/${APPL_NAME}/${CURR_VIEW}"/.build_[0-9]*/*.err >> > "${CURR_VIEW}_err.log" > mail -a "${CURR_VIEW}_err.log" -s "Code quality build > stats and error logs attached for ${CURR_VIEW}" m...@me.em << EOF > ================Printing Code quality build > stats:================== > Total projects for ${CURR_BL} is: ${TTL_PRJ} > Finished projects for ${CURR_BL} is: ${FIN_PRJ} > Success rate in percentage is: ${SUCC_RATE} > EOF > """ > } > } > } > } > } > ``` > So it seems I can't make groovy enough groovy using """. With ''' it works > fine. However I prefer to educate myself if possible. Thanks for making > this happen. >