Gibt es eine Möglichkeit, den Wert innerhalb einer Variablen innerhalb eines einfachen Anführungszeichens zu drucken?

10

Bedenken Sie, ich habe eine Variable festgelegt siteund muss von echooder gedruckt werden. printfWenn ich jedoch ein einfaches Anführungszeichen verwende, um etwas zu schreiben, und eine Variable verwenden möchte, wie dann?

Beispiel:

$ site=unix.stackexchange.com
$ echo "visit:$site"
visit:unix.stackexchange.com

Aber wenn ich ein einfaches Anführungszeichen verwende:

$ echo 'visit:$site'
visit:$site

Dann wissen wir, dass dies ''ein starkes Zitat ist und die Variable nicht erweitern wird

Ich habe etwas versucht:

$ echo 'visit:"$site"'
visit:"$site"

aber nicht erfolgreich. Daher suche ich nach einer Möglichkeit, den Wert innerhalb einer Variablen zu drucken, während ein einfaches Anführungszeichen verwendet wird .

Pandya
quelle
4
Wieso brauchst du es?
Choroba
1
echo 'visite:"'$site'"'? (oder echo "visite:\"$site\""aber es ist nicht einfach zitiert ...)
Fredtantini
@fredtantini nein, dies scheint auch das einfache Anführungszeichen zuerst zu beenden
Pandya
@choroba hat eine Antwort gepostet, die meinem Kommentar sehr ähnlich ist. Zitiervariable sollte bevorzugt werden (dh 'visit:"'"$site"'"')
fredtantini
2
Warum möchten Sie einen Hammer als Schraubendreher verwenden?
Kos

Antworten:

21

Sie können Variablen nicht in einfache Anführungszeichen setzen. Sie können jedoch einfache Anführungszeichen beenden und doppelte Anführungszeichen beginnen:

echo 'visit:"'"$site"'"'

Oder Sie können doppelte Anführungszeichen in doppelte Anführungszeichen zurücksetzen:

echo "visit:\"$site\""
Choroba
quelle
Ich bevorzuge Backslash, gute Idee!
KiwenLau
8

Wenn Sie sich mit dem Drucken variabler Inhalte befassen, sollten Sie sich an printf anstatt an echo halten :

printf 'visit:%s\n' "$site"

wird ausgegeben, visit:gefolgt von Inhalt $siteund einer neuen Zeile, unabhängig von den Zeichen in $site.

cuonglm
quelle
0

Wenn ich Ihre Anfrage richtig verstehe, können Sie die wiedergegebene Zeichenfolge bewerten. Z.B:

# eval echo 'visit:$site'
visit:unix.stackexchange.com
drgnfr
quelle
1
Es scheint, dass die Ausgabe 'visit:unix.stackexchange.com'mit einfachen Anführungszeichen verlangt wird .
Kusalananda
1
Genau das habe ich gesucht, danke @drgnfr! Vollständige Demonstration: cd /var && QUOTED='cd $HOME' && echo $QUOTED && $(eval echo "$QUOTED")- Der erste Befehl bringt Sie in ein bestimmtes Verzeichnis. Am Ende befinden Sie sich in Ihrem HOME-Verzeichnis.
Chris
-1

Choroba ist richtig.

Wenn dies ein Rätsel wäre, würde ich damit antworten:

cat << EOF | sh
> echo 'visit:$site'
> EOF

Wie Jander betont, ist dies für einen Injektionsangriff weit offen. Es war keine ernsthafte Antwort. Wenn also jemand überlegt, so etwas zu verwenden, verwenden Sie es nicht mit nicht vertrauenswürdigen Eingaben. Überprüfen Sie beispielsweise die $siteZeichenfolge als gültige URL, bevor Sie den Inhalt blind ausführen. So etwas wie dies könnte dazu beitragen , (aber der bereitgestellte Ausdruck ist nicht perfekt , weil es immer noch Injektion erlaubt, aber Gebrauch dieser Art von Mechaniker zu testen).

Stephen
quelle
Ich denke EOF(selbst) arbeitet als (ein anderes) einfaches Zitat (so etwas wie :) bash -c 'echo 'visit:$site''!
Pandya
4
Ich hoffe $sitenicht enthalten '\nrm -rf /\necho '!
Jander