Командная строка использует ваш первый sla sh, чтобы процитировать ваш второй. Если CHARLIE_URL=foo
, ваше эхо фактически выводит
sed -i "\|charlie\.url\s*=\s*.*|c\charlie.url = foo" foo.conf
Попробуйте использовать одинарные кавычки, но закройте / откройте их вокруг переменной.
echo 'sed -i "\\|charlie\.url\\s*=\\s*.*|c\\charlie.url = '"${CHARLIE_URL}"'" foo.conf'
Это даст
sed -i "\\|charlie\.url\\s*=\\s*.*|c\\charlie.url = foo" foo.conf
Вы также можете, как уже упоминалось, процитировать sla sh, который цитирует sla sh, а затем цитировать sla sh, цитируемый другим sla sh, чтобы последующие итерации свели их к тому, что вы хотите ... но это, как правило, беспорядок и приводит к синдрому зубочистки.
Кто-то уже сделал хорошее предложение c, так что я не буду повторять это, но вы также можно использовать "здесь строку", которую я обычно предпочитаю.
cat <<< "sed -i '\|charlie\.url\s*=\s*.*|c\charlie.url = ${CHARLIE_URL}' foo.conf"
Я переключил двойные кавычки в вашем скрипте на одиночные, предполагая, что вы хотите вывести буквальное значение $ CHARLIE_URL в ваш скрипт . Если вы хотите, чтобы сценарий использовал переменную с любым значением, присвоенным во время выполнения, укажите это тоже -
cat <<< "sed -i '\|charlie\.url\s*=\s*.*|c\charlie.url = \${CHARLIE_URL}' foo.conf"