Сценарій оболонки: Як я можу записати багаторядковий вміст у файл, якщо файл не існує?


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

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


1
ви можете використовувати> (для перезаписування файлу) або >> (додати, якщо він вже існує). приклад: echo "привіт світ"> file.txt
Роб

це те, що весь статичний текст чи будь-яка його частина повинна бути замінена на динамічне значення? (наприклад, ім'я хоста, порт, кореневий каталог тощо)
Jeff Schaller

Я щойно відредагував ваше запитання, щоб уточнити, але я, можливо, неправильно зрозумів, чого ви хотіли. Ви хочете , щоб додати вміст в файл , навіть якщо він вже існує , або ви тільки хочете створити файл , якщо він не існує? Що має відбутися, якщо файл вже існує?
terdon

Відповіді:


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

Як я можу додати деякий багаторядковий вміст до файлу?
користувач3142695

1
Ще однією розумною зміною слід було б цитувати рядки тут-doc limit, так що будь-які слова, що містять $(якщо вони є), не трактуються як змінні і, отже, не розширюються
Inian

@ user3142695 Найпростіше було б написати тут документ в окремий файл, а потім catдва файли разом і перейменувати результат.
Kusalananda

Якщо хтось хоче зробити багато окремих 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"можливо, трохи читабельнішим; таким чином не потрібно читати весь рядок, щоб зрозуміти, куди втечі ..
Чарльз Даффі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.