In diesem Skript wird "$ 1" in der / test-Datei gespeichert.
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
Die Wahrheit ist ... ich muss behalten
'EOF'
als 'EOF', weil mein Argument ($ 1) Dollarzeichen enthält.
Aber ich brauche dieses Argument, um gespeichert zu werden, anstatt $ 1
bash
shell-script
cat
here-document
user72685
quelle
quelle
$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.cat
Dollarzeichen verwenden und behalten", sondern "Ich möchte das ändernhttpd.conf
, um <einige Einstellungen> auf <diese Weise> zu ändern".Antworten:
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 (oderecho
s):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 zweitencat
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:
wird ausgegeben:
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:
wird den Körper von
myfile
as bekommen$1
und kann danncat
oderecho
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
quelle
Klingt so, als ob Sie einfach die eine Variable in die Datei ausgeben möchten. In diesem Fall funktioniert dies:
Beachten Sie, dass
/test
sich das Verzeichnis im Stammverzeichnis befindet, für das normale Benutzer normalerweise keine Schreibberechtigung haben.BEARBEITEN: Beachten Sie, dass Sie die Dollarzeichen enthaltende Zeichenfolge in der Befehlszeile angeben müssen . Hier erfolgt die Ersetzung, und das Skript kann nachträglich nichts dagegen tun.
quelle