Сценарий оболочки: Как я могу записать многострочный контент в файл, если файл не существует?

9

Мне нужно создать файл /opt/nginx/conf.d/default.confс этим содержимым с помощью сценария оболочки и создать файл, если он не существует:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /usr/share/nginx/html;
}

Как написать многострочный контент через скрипт оболочки?

Я создал каталог

sudo mkdir -p /opt/nginx/conf.d

Но я не знаю, как написать файл.

user3142695
источник
1
Вы можете использовать> (чтобы перезаписать файл) или >> (чтобы добавить, если он уже существует). пример: echo "hello world"> file.txt
Роб
Это весь статический текст или его часть должна быть заменена динамическим значением? (например, имя хоста, порт, корневой каталог и т. д.)
Джефф Шаллер
Я только что отредактировал ваш вопрос, чтобы уточнить, но, возможно, я неправильно понял, что вы хотели. Вы хотите , чтобы добавить содержимое в файл , даже если он уже существует , или вы только хотите создать файл , если он не существует? Что должно произойти, если файл уже существует?
Тердон

Ответы:

13

резюме: использовать >>для добавления, использовать [ -f file ]для проверки.

пытаться

if [ ! -f myfile ]
then
   cat <<EOF > myfile
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name $server ;
    root /usr/share/nginx/html;
}
EOF
fi
  • синтаксис cat <<EOFназывается « здесь документ ».
  • $server будет заменен его значением или пуст, если не определено.
  • как уже указывалось, вы можете использовать одинарные кавычки, 'EOF'чтобы избежать замены var, если он есть.
  • Вы также можете иметь многократное эхо (это может быть болезненно, если слишком много эхо)

    echo "## foo.conf" > foo.conf
    echo param1=hello >> foo.conf
    echo param2=world >> foo.conf
    

предваряя

в bash нет прямого препендинга, либо используйте временный файл

mv file file_tmp
cat new_content file_tmp > file
rm file_tmp

или отредактируйте его

sed -i -e '1r new_file' -e 'wq' file
Archemar
источник
Как бы я добавил несколько многострочного контента в файл?
user3142695
1
Другим разумным изменением было бы заключить в кавычки предельные строки here-doc, чтобы любые слова, содержащие $(если они есть), не обрабатывались как переменные и, следовательно, не расширялись
Inian
@ user3142695 Проще всего было бы написать здесь документ в отдельный файл, а затем catдва файла вместе и переименовать результат.
Кусалананда
Если кто-то хочет сделать много отдельных echos, все же более эффективно иметь только одно перенаправление, помещая их в блок: { echo "foo"; echo "bar"; echo "baz"; } >file- таким образом, мы не открываем заново fileкаждый раз, когда просто хотим записать в него одну строку, и закрывая его, когда эта строка сделана.
Чарльз Даффи
Еще одно хорошее использование здесь документа:cat << EOF | sudo tee /opt/nginx/conf.d/default.conf ...
lp1051
3

Если файл /opt/nginx/conf.d/default.conf не существует, выведите (f) статическую строку в файл:

[ -f /opt/nginx/conf.d/default.conf ] || printf 'server {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n    server_name _;\n    root /usr/share/nginx/html;\n}\n' > /opt/nginx/conf.d/default.conf
Джефф Шаллер
источник
1
Я бы посчитал printf '%s\n' "first line" "second line"чуть более читабельным; таким образом, не нужно читать всю строку, чтобы выяснить, где находятся побеги ...
Чарльз Даффи