Shell脚本:如果文件不存在,如何将多行内容写入文件?


9

我需要/opt/nginx/conf.d/default.conf通过shell脚本使用此内容创建文件,如果不存在则创建文件:

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

如何通过Shell脚本编写多行内容?

我创建了目录

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

但是我不知道如何写文件。


1
您可以使用>(覆盖文件)或>>(附加(如果文件已经存在))。例如:echo“ hello world”> file.txt
Rob

是所有静态文本,还是应该将其任何部分替换为动态值?(例如主机名,端口,根目录等)
Jeff Schaller

我只是编辑了您的问题以弄清楚,但我可能误会了您想要的内容。你要的内容添加到该文件,即使它已经存在,或者你只是想创建,如果它不存在的文件吗?如果文件已经存在,应该怎么办?
terdon

Answers:


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 '10 -10-4

1
另一个明智的选择是引用here-doc限制字符串,以使任何包含$(如果存在)的单词都不会被视为变量,因此不会被扩展
Inian

@ user3142695最简单的方法是将here-document写入一个单独的文件,然后cat将两个文件放在一起并重命名结果。
库萨兰达

如果要执行多个单独的echos,则将它们放在一个块中仅进行一个重定向会更加有效:{ echo "foo"; echo "bar"; echo "baz"; } >file-这样,我们不必file每次都只想向其写一行时就重新打开,并在该行结束时将其关闭。
Charles Duffy

此文档的另一个很好的利用:cat << EOF | sudo tee /opt/nginx/conf.d/default.conf ...
lp1051 '18年

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"可能更具可读性;这样一个并不需要通过整个字符串读揣摩出的逃逸是..
查尔斯·达菲
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.