在此腳本中,我最終將“$1”儲存到 /test 檔案中。
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
事實是..我需要保留
'EOF'
作為“EOF”,因為我的參數($1)包含美元符號。
但我需要保存這個參數而不是 1 美元
答案1
跟進您的上一個問題,聽起來你想要兩個都一些未解釋的文本和一些解釋的文本進入文件。在這種情況下,請使用兩個不同的cat
s (或echo
s):
cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF
這裡發生了一些事情:首先,特雷多克語法與<<
.如果您在該終止符字串中包含引號(如上面第一個字串中所示),則整個heredoc將不會被解釋-沒有參數,也沒有替換。如果你不使用任何引號,例如第二 cat
上面,類似的變數$1
將被它們的值替換,並且命令替換將包含在文字中。您可以根據是否需要替換來選擇是否引用“EOF”字串。
將兩個cat
s 放入我們正在使用的同一個檔案中>>
重定向對於第二次(以及以後的任何一次)重定向:這意味著附加到檔案。對於第一個,我們使用單一>
清除檔案並重新開始。
請注意,即使當變數被替換,該變數值中的任何其他美元符號不是重新替換自己:
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
位於根目錄中,普通使用者通常沒有寫入權限。
編輯:請記住,您需要引用包含美元符號的字串在命令列中。這就是替換發生的地方,並且腳本在事後無法對其執行任何操作。