Наилучший подход
Пожалуйста, смотрите другие ответы для предложений по совершенно лучшему подходу.
Как исправить этот подход
Это правильное (и хитрое) цитирование для вашего текущего подхода:
String cmd = "curl -X PUT IP:PORT/twitter/_doc/10 -H '"\'"'Content-Type: application/json'"\'"' -d '"\'"'{ \"user\" : \"Bob\", \"post_date\" : \"2019-12-15T14:12:10\", \"message\" : \"trying out Elasticsearch\" }'"\'"' ";
[...]
Runtime.getRuntime().exec("/bin/bash "+"-c "+"'"+cmd+"'");
Внутри строки, передаваемой в оболочку внутри одинарных кавычек, вы избегаете других одинарных кавычек, заканчивая текущую одинарную кавычку ('
), начиная двойную кавычку ("
), добавляя экранированную одинарную кавычку (\'
), закрывая двойную кавычку ("
) и продолжая строку в одинарных кавычках ('
).
Вместе мы записываем это как '"\'"'
, с контекстом это bli '"\'"'single-quote-inside-json'"\'"' bla
, которое становится /bin/bash -c 'bli '"\'"'single-quote-inside-json'"\'"' bla'
.
Почему так сложно?
Причину, по которой это необходимо, можно найти на странице справки bash (1):
Одиночная кавычка может не встречаться между одинарными кавычками, даже если ей предшествует обратная косая черта.
Вот почему мы должны заканчивать одинарную кавычку, начинать двойную кавычку (гдеможно убрать кавычку), завершить двойную кавычку и продолжить нашу одинарную кавычку.