How can I write a heredoc to a file in Bash script?

前端 未结 9 1000
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-22 12:33

How can I write a here document to a file in Bash script?

相关标签:
9条回答
  • 2020-11-22 13:13

    Note:

    • the following condenses and organizes other answers in this thread, esp the excellent work of Stefan Lasiewski and Serge Stroobandt
    • Lasiewski and I recommend Ch 19 (Here Documents) in the Advanced Bash-Scripting Guide

    The question (how to write a here document (aka heredoc) to a file in a bash script?) has (at least) 3 main independent dimensions or subquestions:

    1. Do you want to overwrite an existing file, append to an existing file, or write to a new file?
    2. Does your user or another user (e.g., root) own the file?
    3. Do you want to write the contents of your heredoc literally, or to have bash interpret variable references inside your heredoc?

    (There are other dimensions/subquestions which I don't consider important. Consider editing this answer to add them!) Here are some of the more important combinations of the dimensions of the question listed above, with various different delimiting identifiers--there's nothing sacred about EOF, just make sure that the string you use as your delimiting identifier does not occur inside your heredoc:

    1. To overwrite an existing file (or write to a new file) that you own, substituting variable references inside the heredoc:

      cat << EOF > /path/to/your/file
      This line will write to the file.
      ${THIS} will also write to the file, with the variable contents substituted.
      EOF
      
    2. To append an existing file (or write to a new file) that you own, substituting variable references inside the heredoc:

      cat << FOE >> /path/to/your/file
      This line will write to the file.
      ${THIS} will also write to the file, with the variable contents substituted.
      FOE
      
    3. To overwrite an existing file (or write to a new file) that you own, with the literal contents of the heredoc:

      cat << 'END_OF_FILE' > /path/to/your/file
      This line will write to the file.
      ${THIS} will also write to the file, without the variable contents substituted.
      END_OF_FILE
      
    4. To append an existing file (or write to a new file) that you own, with the literal contents of the heredoc:

      cat << 'eof' >> /path/to/your/file
      This line will write to the file.
      ${THIS} will also write to the file, without the variable contents substituted.
      eof
      
    5. To overwrite an existing file (or write to a new file) owned by root, substituting variable references inside the heredoc:

      cat << until_it_ends | sudo tee /path/to/your/file
      This line will write to the file.
      ${THIS} will also write to the file, with the variable contents substituted.
      until_it_ends
      
    6. To append an existing file (or write to a new file) owned by user=foo, with the literal contents of the heredoc:

      cat << 'Screw_you_Foo' | sudo -u foo tee -a /path/to/your/file
      This line will write to the file.
      ${THIS} will also write to the file, without the variable contents substituted.
      Screw_you_Foo
      
    0 讨论(0)
  • 2020-11-22 13:13

    As instance you could use it:

    First(making ssh connection):

    while read pass port user ip files directs; do
        sshpass -p$pass scp -o 'StrictHostKeyChecking no' -P $port $files $user@$ip:$directs
    done <<____HERE
        PASS    PORT    USER    IP    FILES    DIRECTS
          .      .       .       .      .         .
          .      .       .       .      .         .
          .      .       .       .      .         .
        PASS    PORT    USER    IP    FILES    DIRECTS
    ____HERE
    

    Second(executing commands):

    while read pass port user ip; do
        sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
        COMMAND 1
        .
        .
        .
        COMMAND n
    ENDSSH1
    done <<____HERE
        PASS    PORT    USER    IP
          .      .       .       .
          .      .       .       .
          .      .       .       .
        PASS    PORT    USER    IP    
    ____HERE
    

    Third(executing commands):

    Script=$'
    #Your commands
    '
    
    while read pass port user ip; do
        sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip "$Script"
    
    done <<___HERE
    PASS    PORT    USER    IP
      .      .       .       .
      .      .       .       .
      .      .       .       .
    PASS    PORT    USER    IP  
    ___HERE
    

    Forth(using variables):

    while read pass port user ip fileoutput; do
        sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
        #Your command > $fileinput
        #Your command > $fileinput
    ENDSSH1
    done <<____HERE
        PASS    PORT    USER    IP      FILE-OUTPUT
          .      .       .       .          .
          .      .       .       .          .
          .      .       .       .          .
        PASS    PORT    USER    IP      FILE-OUTPUT
    ____HERE
    
    0 讨论(0)
  • 2020-11-22 13:17

    For future people who may have this issue the following format worked:

    (cat <<- _EOF_
            LogFile /var/log/clamd.log
            LogTime yes
            DatabaseDirectory /var/lib/clamav
            LocalSocket /tmp/clamd.socket
            TCPAddr 127.0.0.1
            SelfCheck 1020
            ScanPDF yes
            _EOF_
    ) > /etc/clamd.conf
    
    0 讨论(0)
提交回复
热议问题