Übergeben einer Variablen an ein Bash-Skript, das ‚EOF‘ verwendet und die Variable als Literal betrachtet

Übergeben einer Variablen an ein Bash-Skript, das ‚EOF‘ verwendet und die Variable als Literal betrachtet

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 cats (oder echos):

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 catoben $1werden 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 cats 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 $barWert 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 myfileas erhalten $1und kann dann catoder echoes 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 /testes 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.

verwandte Informationen