將變數傳遞給使用“EOF”的 bash 腳本並將該變數視為文字

將變數傳遞給使用“EOF”的 bash 腳本並將該變數視為文字

在此腳本中,我最終將“$1”儲存到 /test 檔案中。

#!/bin/bash
cat > /test << 'EOF'
$1
EOF

事實是..我需要保留

'EOF'

作為“EOF”,因為我的參數($1)包含美元符號。

但我需要保存這個參數而不是 1 美元

答案1

跟進您的上一個問題,聽起來你想要兩個都一些未解釋的文本和一些解釋的文本進入文件。在這種情況下,請使用兩個不同的cats (或echos):

cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF

這裡發生了一些事情:首先,特雷多克語法與<<.如果您在該終止符字串中包含引號(如上面第一個字串中所示),則整個heredoc將不會被解釋-沒有參數,也沒有替換。如果你使用任何引號,例如第二 cat上面,類似的變數$1將被它們的值替換,並且命令替換將包含在文字中。您可以根據是否需要替換來選擇是否引用“EOF”字串。

將兩個cats 放入我們正在使用的同一個檔案中>> 重定向對於第二次(以及以後的任何一次)重定向:這意味著附加到檔案。對於第一個,我們使用單一>清除檔案並重新開始。

請注意,即使當變數被替換,該變數值中的任何其他美元符號不是重新替換自己:

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF

將輸出:

$bar

無需替換$bar的值。

但是,如果您在整個腳本的參數中提供“$”,則需要在命令列上對其進行轉義或將整個內容用單引號引起來。或者,命令替換你的另一個問題允許您直接放入整個文件的內容,包括文件內容中的任何美元符號。確保在那裡引用替換字串:

oo.sh "$(cat myfile)"

myfile將得到as的主體$1,然後可以根據需要cat或it 。echo與中相同的限制我的回答在那裡apply:命令列參數的長度是有限制的,如果你的檔案可能比這個長,你應該找到另一種方法。您可以使用以下命令了解您的系統的限制getconf ARG_MAX

答案2

聽起來您只是想將一個變數輸出到文件中。在這種情況下,這將會起作用:

echo $1 >/test

請注意,它/test位於根目錄中,普通使用者通常沒有寫入權限。

編輯:請記住,您需要引用包含美元符號的字串在命令列中。這就是替換發生的地方,並且腳本在事後無法對其執行任何操作。

相關內容