sanatize bash string для gitlab yaml - PullRequest
0 голосов
/ 21 июня 2019

У меня проблемы с экранированием строки, содержащей контрольный символ

testRESULT=$(awk -F"Executed " '/Executed /{print $2}' results.out)

это строка 9 из 10 спецификаций INCOMPLETE (1 PENDING) за 30 секунд.

и этоcmd, где он используется

curl -X POST -u ${JIRATOKEN} -H Content-Type:application/json --data '{"body":"'"$testRESULT"'- SauceLabs results available at '"\n$sauceLabsURL"'"}' https://EXAMPLEURL

И это ошибка

{"errorMessages":["Illegal unquoted character ((CTRL-CHAR, code 27)): has to be escaped using backslash to be included in string value\n at [Source: org.apache.catalina.connector.CoyoteInputStream@436d6c79; line: 1, column: 24]"]}

, что является наилучшим способом очистки переменных Bash, которые могут содержать символы любого типа, которые будут переданы в сообщение curlJSON

1 Ответ

0 голосов
/ 22 июня 2019

Символ, на который жалуется ошибка, является escape-кодом ASCII.Вы хотите избежать этого или удалить его?

Я предполагаю, что виновником является $testRESULT.

Чтобы удалить это \27 символ:

testRESULT="${testRESULT//$'\27'/}"

вместо этого вместо этого (это будет оболочкой экранировать всю строку):

printf -v testRESULT '%q' "$testRESULT"

или экранировать только экранирование ASCII:

ascii_esc='\27'    # literal (change to the form that is expected)
testRESULT="${testRESULT//$'\27'/$ascii_esc}"

Тогда я разбью эту длинную строку JSONв массив и используйте переменную массива в команде curl.Это сделает вещи более читабельными и понятными.И не забывайте указывать в кавычках свои переменные.

jsonstring=(
    '{"body":"'
    "$testRESULT"
    '- SauceLabs results available at '
    "\n$sauceLabsURL"
    '"}'
)

curl -X POST -u "$JIRATOKEN" -H Content-Type:application/json --data "${jsonstring[@]}" https://EXAMPLEURL

Но, в конечном итоге, вы должны рассмотреть возможность работы с JSON с использованием таких инструментов, как библиотеки в Python и т. Д.

...