プレフィックス

プレフィックス

シェルスクリプトを介してこのコンテンツを含むファイルを生成する必要があります/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

要約:>>追加用、[ -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がある場合に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

答え2

/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

答え3

改行文字をに渡すことを防ぐことはできませんecho。一重引用符または二重引用符内の改行文字は、Bourneなどのシェルの他の文字よりも特別ではありません。

if [ ! -e "$file" ]; then
  echo "server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name $server;
    root /usr/share/nginx/html;
}" > "$file"
fi

最後の行区切り文字自体を追加しないことに注意してくださいecho

出力したいテキストにバックスラッシュが含まれている場合、またはで始まる場合は、-代わりに使用できますprintf。 forまたは同様に末尾の改行を自動的に追加し、出力したいprintf '%s\n' "text"テキストに改行を追加します。echoprintf %s

if [ ! -e "$file" ]; then
  printf %s "server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name $server;
    root /usr/share/nginx/html;
}
" > "$file"
fi

印刷される各引数に複数の引数を渡して改行を追加することもできますprintf '%s\n' ...printf

new_lines=(
  'server {'
  '  listen 80 default_server;'
  '  listen [::]:80 default_server;'
  "  server_name $server;"
  '  root /usr/share/nginx/html;'
  '}'
)
[ -e "$file" ] || printf '%s\n' "${new_lines[@]}" > "$file"

ここでは、各行に使用する参照の種類を決定します。

ただし、パラメータが渡されない場合は空白printf '%s\n'行が印刷されます。では代わりに使用zshできますprint -rC1 --。または、次のいずれかを定義できます。

println() {
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}

アクセシビリティ。

さらに、ターゲットが通常のファイルとして存在する場合、noclobberPOSIXシェルのオプションにより>リダイレクト演算子が失敗します。

だから:

set -o noblobber # same as set -C
printf '%s\n' "$newcontent" > "$file"

すでに存在する場合(通常のファイルとして)$newcontentに記録されないことが保証されます$file。デバイス(シンボリックリンクなど/dev/null)、ディレクトリ、fifoなどの場合$newcontentは、まだ記録されません。 TOCTOU競争条件を完全に避けてください。なぜなら、シェルはまだファイルタイプを最初にチェックする必要があるからです。

タイプに関係なく既に存在するファイルを競合せずに作成したくない場合は、この機能を使用して次のフラグを使用してファイルをzsh開くことができます。O_EXCL

zmodload zsh/system
(sysopen -w -o excl -u 1 -- $file && print -r -- $newcontent > $file)

二重引用符の中にバックスラッシュが前に来ない限り、1です。

関連情報