Kabuk betiği: Dosya yoksa çok satırlı içeriği dosyaya nasıl yazabilirim?


9

Ben dosyası oluşturmak için gereken /opt/nginx/conf.d/default.confkabuk komut dosyası üzerinden bu içerikle ve onu yoksa dosya oluşturmak:

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

Çok satırlı içeriği bir kabuk komut dosyası aracılığıyla nasıl yazabilirim?

Dizini oluşturdum

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

Ama nasıl dosya yazacağımı bilmiyorum.


1
> (dosyanın üzerine yazmak için) veya >> (zaten varsa eklemek için) tuşunu kullanabilirsiniz. örnek: echo "merhaba dünya"> file.txt
Rob

tüm statik metin mi, yoksa herhangi bir kısmı dinamik bir değerle mi değiştirilmelidir? (örn. ana bilgisayar adı, bağlantı noktası, kök dizin, vb.)
Jeff Schaller

Sorunuzu açıklığa kavuşturmak için yeni düzenledim, ancak ne istediğinizi yanlış anlamış olabilirim. İçeriği zaten mevcut olsa bile dosyaya mı eklemek istiyorsunuz , yoksa sadece yoksa dosya oluşturmak mı istiyorsunuz? Dosya zaten varsa ne olur?
terdon

Yanıtlar:


13

özet: >>eklemek için kullanın [ -f file ], test etmek için kullanın .

Deneyin

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
  • sözdizimine cat <<EOF" burada belge " denir .
  • $server değeri ile değiştirilir veya tanımlanmamışsa boş olur.
  • belirtildiği gibi, varsa 'EOF'var değiştirmek için tek alıntı kullanabilirsiniz .
  • ayrıca birden çok yankı da olabilir (bu çok fazla yankı varsa korumak için acı verici olabilir)

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

prepending

bash içinde doğrudan başa geçme yok, ya geçici dosya kullan

mv file file_tmp
cat new_content file_tmp > file
rm file_tmp

veya düzenle

sed -i -e '1r new_file' -e 'wq' file

Çok satırlı içeriği bir dosyaya nasıl başlatabilirim?
user3142695

1
Yapılacak başka bir akıllı değişiklik, burada-doc sınır dizelerini alıntılamak olacaktır, böylece $(varsa) içeren herhangi bir kelime değişken olarak ele alınmaz ve bu nedenle genişletilmez
Inian

@ user3142695 En kolayı bu belgeyi ayrı bir dosyaya ve ardından catiki dosyayı birlikte yazmak ve sonucu yeniden adlandırmak olacaktır.
Kusalananda

Biri birçok ayrı yapmak istiyorsa echo, sadece bir yönlendirmeye sahip olmak, onları bir bloğa koyarak daha etkilidir: { echo "foo"; echo "bar"; echo "baz"; } >file- bu şekilde, fileher bir satır yazmak istediğimizde yeniden açmıyoruz, ve bu çizgi bittiğinde kapatalım.
Charles Duffy

Bu belgenin bir başka iyi kullanımı:cat << EOF | sudo tee /opt/nginx/conf.d/default.conf ...
lp1051

3

/Opt/nginx/conf.d/default.conf dosyası yoksa değil var, o dosyaya statik dize (f) yazdırın:

[ -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"Belki biraz daha okunaklı olduğunu düşünürdüm ; bu şekilde kaçışların nerede olduğunu anlamak için tüm ipi okuması gerekmez ..
Charles Duffy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.