Я пытаюсь создать файл в сценарии bash, используя EOF. Файл создается правильно, но часть кода javascript, где я определяю переменную, не учитывается и искажает код:
Фрагмент кода Javascript/Bash
cat << EOF > map.php
$( "#slider" ).slider({
value:60,
min: 1.0,
max: 100.0,
animate: true,
animate: 500,
slide: function( event, ui ) {
historicalOverlay.setOpacity( ui.value/100 );
}
});
EOF
Результат
.slider({
value:60,
min: 1.0,
max: 100.0,
animate: true,
animate: 500,
slide: function( event, ui ) {
historicalOverlay.setOpacity( ui.value/100 );
}
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Все строки здесь-документ подвергаются расширению параметров, подстановке команд и арифметическому расширению.
Последовательность $( "#slider" ) является подстановкой команды. Оболочка запускает #slider (что не работает, потому что представляет комментарий) и заменяет последовательность выводом команды (без вывода).
Если вы хотите, чтобы ваш скрипт выводил фрагмент JS дословно, вы можете поместить разделитель здесь-документа в одинарные кавычки:
cat << 'EOF' > map.php
$("#slider").slider({
value:60,
min: 1.0,
max: 100.0,
animate: true,
animate: 500,
slide: function( event, ui ) {
historicalOverlay.setOpacity( ui.value/100 );
}
});
EOF
Это говорит оболочке не расширять какую-либо специальную последовательность внутри текста.
Если код JS содержит части, которые необходимо заменить (параметры, команды и т. д.), вы можете оставить разделитель без кавычек и позаботиться об экранировании любого символа, который отмечает расширение или замену.
Применительно к приведенному выше коду это приводит к:
cat << EOF > map.php
\$("#slider").slider({
value:60,
min: 1.0,
max: 100.0,
animate: true,
animate: 500,
slide: function( event, ui ) {
historicalOverlay.setOpacity( ui.value/100 );
}
});
EOF
Что делать, если у меня есть настоящие переменные bash, которые мне нужно оставить? то есть команда date типа ${YYYYMMDD}
Хорошо, я исправил проблему... Я добавил \ перед строкой, и теперь она не читается.
В качестве альтернативы: поместите части, которые выглядят как расширения оболочки, в свои собственные переменные, например. slider='$("#slider)' (примечание: в одинарных кавычках), которые затем можно вставить в здесь-документ: cat << EOF ... ${slider}.slider({ ....
Я добавил обратную косую черту перед строкой/переменной JS:
cat << EOF > map.php
\$( "#slider" ).slider({
value:60,
min: 1.0,
max: 100.0,
animate: true,
animate: 500,
slide: function( event, ui ) {
historicalOverlay.setOpacity( ui.value/100 );
}
});
EOF
См. этот вопрос-ответ о цитировании в документации.