Wenn Sie Ihre vorherige Frage weiterverfolgen, möchten Sie, dass sowohl nicht interpretierter als auch interpretierter Text in eine Datei aufgenommen wird. Verwenden Sie in diesem Fall zwei verschiedene cat
s (oder echo
s):
cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF
Hier ist einiges los: Erstens die Heredoc- Syntax mit <<
. Wenn Sie Anführungszeichen in diese Abschlusszeichenfolge einfügen, wie im ersten oben, wird der gesamte Heredoc nicht interpretiert - keine Parameter und keine Ersetzungen. Wenn Sie nicht keine Anführungszeichen verwenden, wie in der zweiten cat
oben, Variablen wie $1
durch ihre Werte und Befehlsersetzungen ersetzt werden in den Text aufgenommen werden. Sie können wählen, ob Sie die Zeichenfolge "EOF" in Anführungszeichen setzen möchten oder nicht, je nachdem, ob Sie Ersetzungen wünschen oder nicht.
Um beide cat
s in dieselbe Datei zu setzen, verwenden wir die >>
Umleitung für die zweite (und spätere) Umleitung: Das bedeutet, dass an die Datei angehängt wird. Für den ersten verwenden wir eine einzelne >
, um die Datei zu löschen und neu zu beginnen.
Beachten Sie, dass selbst wenn Variablen ersetzt werden , zusätzliche Dollarzeichen im Wert dieser Variablen nicht selbst ersetzt werden:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
wird ausgegeben:
$bar
ohne den $bar
Wert von in zu ersetzen .
Wenn Sie jedoch ein "$" im Argument für dieses gesamte Skript angeben, müssen Sie es in der Befehlszeile maskieren oder das Ganze in einfache Anführungszeichen setzen. Alternativ können Sie durch Ersetzen von Befehlen wie in Ihrer anderen Frage den Inhalt einer gesamten Datei direkt einfügen, einschließlich aller Dollarzeichen im Dateiinhalt. Stellen Sie sicher, dass Sie dort die Ersetzungszeichenfolge angeben:
oo.sh "$(cat myfile)"
wird den Körper von myfile
as bekommen $1
und kann dann cat
oder echo
es nach Bedarf. Es gelten die gleichen Einschränkungen wie in meiner Antwort : Es gibt eine Begrenzung für die Länge der Befehlszeilenargumente. Wenn Ihre Datei länger wird, sollten Sie einen anderen Ansatz finden. Sie können herausfinden, mit welchem Limit Ihr System begrenzt istgetconf ARG_MAX
$1
) Dollarzeichen enthält." Nicht, wenn es sich auf den ersten Befehlszeilenparameter bezieht. Dies wurde ersetzt, bevor Ihr Skript ausgeführt wurde. Sie müssen es in der Befehlszeile entkommen.