シェルスクリプトを介してこのコンテンツを含むファイルを生成する必要があります/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"
テキストに改行を追加します。echo
printf %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' "$@"
}
アクセシビリティ。
さらに、ターゲットが通常のファイルとして存在する場合、noclobber
POSIXシェルのオプションにより>
リダイレクト演算子が失敗します。
だから:
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です。