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.