linux - grep變數 - shell script read




我怎樣才能寫一個heredoc到Bash腳本中的文件? (5)

何時需要root權限

當目標文件需要root權限時,使用|sudo tee而不是>

cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF

如何在Bash腳本中將文檔寫入文件?


注意:

這個問題(如何在bash腳本中寫一個here文件(aka heredoc )到一個文件?)有(至少)3個主要的獨立維度或子問題:

  1. 你想覆蓋現有文件,追加到現有文件還是寫入新文件?
  2. 您的用戶或其他用戶(例如root )是否擁有該文件?
  3. 你想直接寫出你的heredoc的內容,還是讓bash在你的heredoc中解釋變量引用?

(還有其他的維度/子問題我認為不重要,考慮編輯這個答案來添加它們!)下面是上面列出的問題維度的一些更重要的組合,以及各種不同的分隔標識符 - 沒有什麼神聖的EOF ,只要確保您用作分隔標識符的字符串不會發生在您的heredoc內部:

  1. 要覆蓋您擁有的現有文件(或寫入新文件),請在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. 要附加您擁有的現有文件(或寫入新文件),請使用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. 要使用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. 要使用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. 要覆蓋root所擁有的現有文件(或寫入新文件),請在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. 要追加由user = foo擁有的現有文件(或寫入新文件)和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
    

對於未來可能遇到此問題的人員,採用以下格式:

(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

而不是使用cat和I / O重定向,而是使用tee來代替:

tee newfile <<EOF
line 1
line 2
line 3
EOF

它更簡潔,而且與重定向運算符不同,它可以與sudo結合使用,如果需要使用根權限寫入文件。


閱讀高級Bash腳本指南第19章。這裡的文檔

這是一個將內容寫入/tmp/yourfilehere文件的例子

cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
        This line is indented.
EOF

請注意,最後的'EOF'(The LimitString )在單詞前不應該有空格,因為這意味著LimitString不會被識別。

在shell腳本中,您可能希望使用縮進來使代碼可讀,但這可能會在您的here文檔中產生縮進文本的不良效果。 在這種情況下,使用<<- (後跟破折號)禁用前導製表符( 請注意 ,為了測試此操作,您需要用製表符替換前導空白符 ,因為我無法在此打印實際的製表符。)

#!/usr/bin/env bash

if true ; then
    cat <<- EOF > /tmp/yourfilehere
    The leading tab is ignored.
    EOF
fi

如果您不想解釋文本中的變量,請使用單引號:

cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF

通過命令管道來管理heredoc:

cat <<'EOF' |  sed 's/a/b/'
foo
bar
baz
EOF

輸出:

foo
bbr
bbz

...或者使用sudo將heredoc寫入文件:

cat <<'EOF' |  sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF




heredoc