У меня есть один сценарий bash, который предназначен для вывода другого сценария bash. Я использую cat
. Я хочу оценить некоторые выражения в выходном скрипте, но не другие.
PROJECT=myproject
cat << EOF > create_dir.sh
#!/usr/bin/env bash
DATE=`date '+%y%m%d-%H%M'`
mkdir $PROJECT/\$DATE
EOF
Полученный файл create_dir.sh
выглядит следующим образом:
#!/usr/bin/env bash
DATE=171123-1834
mkdir myproject/$DATE
Я хочу получить следующий результат:
#!/usr/bin/env bash
DATE=`date '+%y%m%d-%H%M'`
mkdir myproject/$DATE
Как я могу изменить этот скрипт так, чтобы выражение, следующее за DATE=
, не оценивается, и в то же время гарантирует, что $PROJECT
оценивается?
Вам необходимо экранировать символы `` ', поскольку они означают «выполнить этот код». Так что строка должна выглядеть так:
DATE=\`date '+%y%m%d-%H%M'\`
cat << \EOF
Если метка заключена в кавычки, то здесь документ принимается как есть. Или же процитируйте обратные кавычки в этом документе.
Соответствующей частью страницы руководства является:
Если какая-либо часть слова заключена в кавычки, разделитель является результатом удаления кавычки на слово , и строки в данном документе не раскрываются. Если слово не заключено в кавычки, все строки документа здесь подвергаются расширению параметров, подстановке команд и арифметическому расширению, последовательность символов
\
< newline > игнорируется, и\
должен использоваться для цитирования символов\
,$
и`
.
Обратите внимание, что это решение будет копировать здесь документ дословно; чтобы сделать некоторые расширения, а другие не сделать, единственное решение - использовать \
, чтобы процитировать те конструкции, которые не раскрываются.