In diesem Skript endet es damit, dass „$1“ in der Datei /test gespeichert wird.
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
die Wahrheit ist, ich muss
'EOF'
als „EOF“, weil mein Argument ($1) Dollarzeichen enthält.
aber ich brauche dieses Argument, um es zu speichern, anstatt 1 $
Antwort1
Nachverfolgung Ihrervorherige Frage, es klingt, als ob Sie wollenbeideein Teil des nicht interpretierten Textes und ein Teil des interpretierten Textes, der in eine Datei eingeht. 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 passieren mehrere Dinge: Erstens diehierdocSyntax mit <<
. Wenn Sie Anführungszeichen in diese Terminatorzeichenfolge einfügen, wie im ersten oben, wird das gesamte Heredoc nicht interpretiert – keine Parameter und keine Ersetzungen. Wenn SienichtVerwenden Sie Anführungszeichen, wie in derzweite cat
oben $1
werden Variablen wie durch ihre Werte ersetzt und Befehlsersetzungen werden in den Text aufgenommen. Sie können wählen, ob die Zeichenfolge „EOF“ in Anführungszeichen gesetzt werden soll oder nicht, je nachdem, ob Sie Ersetzungen wünschen oder nicht.
Um beide cat
s in die gleiche Datei zu packen, verwenden wir>>
Umleitungfür die zweite (und alle späteren) Umleitungen: das heißt, an die Datei anzuhängen. Für die erste verwenden wir eine einzelne, >
um die Datei zu löschen und neu zu beginnen.
Beachten Sie, dass selbst wennVariablen werden ersetzt, alle zusätzlichen Dollarzeichen im Wert dieser Variablensind nichthaben sich selbst ersetzt:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
gibt aus:
$bar
ohne den $bar
Wert zu ersetzen.
Wenn Sie jedoch ein "$" im Argument für dieses ganze Skript angeben, müssen Sie es in der Befehlszeile maskieren oder das Ganze in einfache Anführungszeichen setzen. Alternativ:Befehlsersetzungwie indeine andere Frageermöglicht Ihnen, den Inhalt einer ganzen Datei direkt einzufügen, einschließlich aller Dollarzeichen im Dateiinhalt. Stellen Sie sicher, dass Sie die Ersetzungszeichenfolge dort in Anführungszeichen setzen:
oo.sh "$(cat myfile)"
wird den Körper von myfile
as erhalten $1
und kann dann cat
oder echo
es als erforderlich. Die gleichen Einschränkungen wie inmeine Antwort dortgelten: Es gibt eine Begrenzung für die Länge der Befehlszeilenargumente. Wenn Ihre Datei länger werden könnte, sollten Sie einen anderen Ansatz finden. Sie können die Begrenzung auf Ihrem System mitgetconf ARG_MAX
Antwort2
Klingt, als ob Sie einfach die eine Variable in die Datei ausgeben möchten. In diesem Fall funktioniert das:
echo $1 >/test
Beachten Sie, dass /test
es sich um das Stammverzeichnis handelt, für das normale Benutzer normalerweise keine Schreibberechtigung haben.
EDIT: Denken Sie daran, dass Sie die Zeichenfolge mit dem Dollarzeichen in Anführungszeichen setzen müssen.in der Kommandozeile. Dort findet die Ersetzung statt und das Skript kann im Nachhinein nichts mehr dagegen tun.