Shell script: Làm cách nào tôi có thể viết nội dung đa dòng vào tệp nếu tệp không tồn tại?


9

Tôi cần tạo tệp /opt/nginx/conf.d/default.confcó nội dung này thông qua shell script và tạo tệp nếu nó không tồn tại:

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

Làm cách nào để viết nội dung đa dòng thông qua tập lệnh shell?

Tôi đã tạo thư mục

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

Nhưng tôi không biết làm thế nào để viết một tập tin.


1
bạn có thể sử dụng> (để ghi đè tệp) hoặc >> (để chắp thêm nếu nó đã tồn tại). ví dụ: echo "hello world"> file.txt
Rob

là tất cả văn bản tĩnh, hay bất kỳ phần nào của nó nên được thay thế bằng một giá trị động? (ví dụ: tên máy chủ, cổng, thư mục gốc, v.v.)
Jeff Schaller

Tôi chỉ chỉnh sửa câu hỏi của bạn để làm rõ, nhưng tôi có thể đã hiểu sai những gì bạn muốn. Bạn có muốn thêm nội dung vào tệp ngay cả khi nó đã tồn tại hay bạn chỉ muốn tạo tệp nếu nó không tồn tại? Điều gì sẽ xảy ra nếu tập tin đã tồn tại?
terdon

Câu trả lời:


13

tóm tắt: sử dụng >>để chắp thêm, sử dụng [ -f file ]để kiểm tra.

thử

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
  • cú pháp cat <<EOFđược gọi là " tài liệu ở đây ".
  • $server sẽ được thay thế bằng giá trị của nó, hoặc trống nếu không xác định.
  • như đã chỉ ra, bạn có thể sử dụng trích dẫn đơn 'EOF'để tránh thay thế var nếu có.
  • bạn cũng có thể có nhiều tiếng vang (điều này có thể rất đau để duy trì nếu quá nhiều tiếng vang)

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

chuẩn bị

không có tiền gửi trực tiếp trong bash, hoặc sử dụng tệp tạm thời

mv file file_tmp
cat new_content file_tmp > file
rm file_tmp

hoặc chỉnh sửa nó

sed -i -e '1r new_file' -e 'wq' file

Làm thế nào tôi có thể thêm một số nội dung đa dòng vào một tệp?
dùng3142695

1
Một thay đổi khôn ngoan khác cần làm là trích dẫn các chuỗi giới hạn tài liệu ở đây, sao cho mọi từ có chứa $(nếu có) không được coi là biến và do đó không được mở rộng
Inian

@ user3142695 Cách dễ nhất là viết tài liệu ở đây vào một tệp riêng biệt và sau đó cathai tệp lại với nhau và đổi tên kết quả.
Kusalananda

Nếu một người muốn thực hiện nhiều thao tác riêng biệt echo, sẽ vẫn hiệu quả hơn khi chỉ có một lần chuyển hướng, bằng cách đặt chúng vào một khối: { echo "foo"; echo "bar"; echo "baz"; } >file- theo cách đó chúng tôi không mở lại filemỗi khi chúng tôi chỉ muốn viết một dòng cho nó, và đóng nó khi dòng đó được thực hiện.
Charles Duffy

Một cách sử dụng tốt khác của tài liệu ở đây:cat << EOF | sudo tee /opt/nginx/conf.d/default.conf ...
lp1051

3

Nếu tệp /opt/nginx/conf.d/default.conf không tồn tại, thì hãy in (f) chuỗi tĩnh vào tệp:

[ -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
Tôi printf '%s\n' "first line" "second line"có thể xem xét có lẽ dễ đọc hơn một chút; theo cách đó, người ta không cần phải đọc qua toàn bộ chuỗi để tìm ra nơi thoát ra ..
Charles Duffy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.