Script shell: Comment puis-je écrire du contenu multiligne dans un fichier si le fichier n'existe pas?

9

Je dois créer le fichier /opt/nginx/conf.d/default.confavec ce contenu via un script shell et créer le fichier s'il n'existe pas:

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

Comment écrire du contenu multiligne via un script shell?

J'ai créé le répertoire

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

Mais je ne sais pas comment écrire un fichier.

user3142695
la source
1
vous pouvez utiliser> (pour écraser le fichier) ou >> (pour ajouter s'il existe déjà). exemple: echo "hello world"> file.txt
Rob
est-ce que tout le texte statique, ou faut-il en remplacer une partie par une valeur dynamique? (par exemple, nom d'hôte, port, répertoire racine, etc.)
Jeff Schaller
Je viens de modifier votre question pour clarifier, mais j'ai peut-être mal compris ce que vous vouliez. Voulez-vous ajouter le contenu au fichier même s'il existe déjà , ou voulez-vous uniquement créer le fichier s'il n'existe pas? Que doit-il se passer si le fichier existe déjà?
terdon

Réponses:

13

résumé: utiliser >>pour ajouter, utiliser [ -f file ]pour tester.

essayer

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
  • la syntaxe cat <<EOFest appelée " ici document ".
  • $server sera remplacé par sa valeur, ou vide s'il n'est pas défini.
  • comme indiqué, vous pouvez utiliser des guillemets simples 'EOF'pour éviter de remplacer var le cas échéant.
  • vous pouvez également avoir plusieurs échos (cela pourrait être pénible à maintenir s'il y a trop d'écho)

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

pré-paiement

il n'y a pas de préfixe direct dans bash, soit utiliser un fichier temporaire

mv file file_tmp
cat new_content file_tmp > file
rm file_tmp

ou éditez-le

sed -i -e '1r new_file' -e 'wq' file
Archemar
la source
Comment ajouter un contenu multiligne à un fichier?
user3142695
1
Un autre changement judicieux à faire serait de citer les chaînes de limites ici-doc, de sorte que tous les mots contenant $(s'ils sont présents) ne soient pas traités comme des variables et ne soient donc pas développés
Inian
@ user3142695 Le plus simple serait d'écrire le document ici dans un fichier séparé, puis catles deux fichiers ensemble et de renommer le résultat.
Kusalananda
Si l'on veut faire plusieurs echos séparés , il est encore plus efficace d'avoir une seule redirection, en les mettant dans un bloc: { echo "foo"; echo "bar"; echo "baz"; } >file- de cette façon, nous ne rouvrirons pas filechaque fois que nous voulons simplement y écrire une seule ligne, et le fermer lorsque cette ligne est terminée.
Charles Duffy
Un autre bon usage de ce document:cat << EOF | sudo tee /opt/nginx/conf.d/default.conf ...
lp1051
3

Si le fichier /opt/nginx/conf.d/default.conf n'existe pas , imprimez (f) la chaîne statique dans le fichier:

[ -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
la source
1
Je considérerais printf '%s\n' "first line" "second line"peut-être un peu plus lisible; de cette façon, on n'a pas besoin de lire toute la chaîne pour savoir où se trouvent les évasions ..
Charles Duffy