Skrip shell: Bagaimana saya bisa menulis konten multiline ke file jika file tidak ada?

9

Saya perlu membuat file /opt/nginx/conf.d/default.confdengan konten ini melalui skrip shell dan membuat file jika tidak ada:

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

Bagaimana cara menulis konten multiline melalui skrip shell?

Saya membuat direktori

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

Tapi saya tidak tahu cara menulis file.

pengguna3142695
sumber
1
Anda dapat menggunakan> (untuk menimpa file) atau >> (untuk menambahkan jika sudah ada). contoh: echo "hello world"> file.txt
Rob
apakah itu semua teks statis, atau haruskah ada bagian yang diganti dengan nilai dinamis? (mis. nama host, port, direktori root, dll)
Jeff Schaller
Saya baru saja mengedit pertanyaan Anda untuk menjelaskan, tetapi saya mungkin telah salah mengerti apa yang Anda inginkan. Apakah Anda ingin menambahkan konten ke file bahkan jika sudah ada , atau apakah Anda hanya ingin membuat file jika tidak ada? Apa yang harus terjadi jika file sudah ada?
terdon

Jawaban:

13

ringkasan: gunakan >>untuk menambahkan, gunakan [ -f file ]untuk menguji.

mencoba

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
  • sintaks cat <<EOFdisebut " dokumen di sini ".
  • $server akan diganti oleh nilainya, atau kosong jika tidak ditentukan.
  • seperti yang ditunjukkan, Anda dapat menggunakan tanda kutip tunggal 'EOF'untuk menghindari penggantian var jika ada.
  • Anda juga dapat memiliki beberapa gema (ini bisa menyakitkan untuk dipertahankan jika terlalu banyak gema)

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

mengawali

tidak ada prepend langsung dalam bash, baik menggunakan file sementara

mv file file_tmp
cat new_content file_tmp > file
rm file_tmp

atau edit itu

sed -i -e '1r new_file' -e 'wq' file
Archemar
sumber
Bagaimana cara saya menambahkan beberapa konten multiline ke file?
user3142695
1
Perubahan bijak lain yang dilakukan adalah mengutip string batas di sini-doc, sehingga kata apa pun yang mengandung $(jika ada) tidak diperlakukan sebagai variabel dan karenanya tidak diperluas
Inian
@ user3142695 Cara termudah adalah menulis dokumen di sini ke file terpisah dan kemudian catdua file bersama-sama dan ganti nama hasilnya.
Kusalananda
Jika seseorang ingin melakukan banyak echos terpisah , masih lebih efisien untuk hanya memiliki satu pengalihan, dengan meletakkannya di blok: { echo "foo"; echo "bar"; echo "baz"; } >file- dengan begitu kita tidak membuka kembali filesetiap kali kita hanya ingin menulis satu baris untuk itu, dan menutupnya ketika garis itu selesai.
Charles Duffy
Penggunaan lain yang baik dari dokumen di sini:cat << EOF | sudo tee /opt/nginx/conf.d/default.conf ...
lp1051
3

Jika file /opt/nginx/conf.d/default.conf tidak ada, maka cetak (f) string statis ke dalam file:

[ -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
Jeff Schaller
sumber
1
Saya akan mempertimbangkan printf '%s\n' "first line" "second line"mungkin sedikit lebih mudah dibaca; dengan cara itu orang tidak perlu membaca seluruh string untuk mencari tahu di mana pelarian itu ..
Charles Duffy