Bedenken Sie, ich habe eine Variable festgelegt site
und muss von echo
oder gedruckt werden. printf
Wenn 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 .
bash
shell
quoting
variable-substitution
Pandya
quelle
quelle
echo 'visite:"'$site'"'
? (oderecho "visite:\"$site\""
aber es ist nicht einfach zitiert ...)'visit:"'"$site"'"'
)Antworten:
Sie können Variablen nicht in einfache Anführungszeichen setzen. Sie können jedoch einfache Anführungszeichen beenden und doppelte Anführungszeichen beginnen:
Oder Sie können doppelte Anführungszeichen in doppelte Anführungszeichen zurücksetzen:
quelle
Wenn Sie sich mit dem Drucken variabler Inhalte befassen, sollten Sie sich an printf anstatt an echo halten :
wird ausgegeben,
visit:
gefolgt von Inhalt$site
und einer neuen Zeile, unabhängig von den Zeichen in$site
.quelle
Wenn ich Ihre Anfrage richtig verstehe, können Sie die wiedergegebene Zeichenfolge bewerten. Z.B:
quelle
'visit:unix.stackexchange.com'
mit einfachen Anführungszeichen verlangt wird .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.Choroba ist richtig.
Wenn dies ein Rätsel wäre, würde ich damit antworten:
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
$site
Zeichenfolge 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).quelle
EOF
(selbst) arbeitet als (ein anderes) einfaches Zitat (so etwas wie :)bash -c 'echo 'visit:$site''
!$site
nicht enthalten'\nrm -rf /\necho '
!