シェルスクリプト:ファイルが存在しない場合に、ファイルに複数行のコンテンツを書き込むにはどうすればよいですか?


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 "hello world"> file.txt
Rob

それはすべて静的テキストですか、それともその一部を動的値で置き換える必要がありますか?(例:ホスト名、ポート、ルートディレクトリなど)
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

ファイルに複数行のコンテンツを追加するにはどうすればよいですか?
user3142695 2017年

1
$
行うも

@ user3142695最も簡単な方法は、ヒアドキュメントを別のファイルに書き込んでからcat、2つのファイルを一緒に書き込み、結果の名前を変更することです。
クサラナンダ

多くの個別echoのs を実行したい場合は、それらをブロックに入れることにより、リダイレクトを1つだけにする方がさらに効率的です。-こうすることで、1行だけを書き込むたびに{ echo "foo"; echo "bar"; echo "baz"; } >file再び開くわけではありませんfile。そしてその行が終わったらそれを閉じます。
Charles Duffy

hereドキュメントのもう1つの有効な使用方法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"おそらくもう少し読みやすいと思います。1はエスケープがどこにあるかを把握するために、文字列全体を通読する必要はありません。そのように...
チャールズダフィー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.