Linux: doppelte Anführungszeichen und für Dateischleife

504
lennelei

In einer anderen Frage wurde mir empfohlen, "$ variables" in meinem Skript in doppelte Anführungszeichen zu setzen, um Fehler zu vermeiden.

Nachdem ich eine Menge Informationen über Anführungszeichen gelesen habe, kann / kann ich davon ausgehen, dass ich Platzhalterzeichen von Anführungszeichen ausschließen kann / muss, wenn ich zum Beispiel Dateien überlaufen muss, aber ich möchte sicher gehen.

Könnten Sie mir bitte sagen, ob bei beiden der folgenden Verwendung die Anführungszeichen richtig sind ?

for file in "$workingdir"/*; do #do something with $file done  if [[ $workingdir == $variable* ]]; then #do something fi 

Für das, was ich in meinen Tests gesehen habe, benutze "$workingdir/*"will die Variable, filemit $workingdir/*der ich nicht will.

Vielen Dank.

Grüße

0
Haben Sie Beispiele dafür, was für bestimmte Dateien passieren sollte? Xen2050 vor 5 Jahren 0
Was passiert, ist was ich will: Ich habe kein Problem mit dem Code. Ich möchte sichergehen, dass dies der richtige Weg ist, da ich immer noch nicht sehr vertraut mit der Verwendung von Anführungszeichen um Variablen bin. lennelei vor 5 Jahren 0
Versuchen Sie es mit einer Variable (Dateiname hier?), Die Leerzeichen und Zeilenumbrüche enthält, und sehen Sie dann, was passiert, indem Sie diese Art von Problemen normalerweise vermeiden. Könnte auch im [[/ test] zitieren Xen2050 vor 5 Jahren 0

2 Antworten auf die Frage

0
xenoid

Die Dateinamenerweiterung erfolgt nach der Wortaufteilung (was in Anführungszeichen steht ...).

So "$mydir"/*dehnt sich "my directory"/*nach der Variablensubstitution, dann my directory/*(als ein einzelnes Wort) nach Wort-Spaltung, und dann my directory/file1, my directory/file2nach dem Dateinamen Expansion.

0
Gordon Davisson

Das erste Beispiel, das Sie gegeben haben, ist korrekt (vorausgesetzt, es ist offensichtlich).

for file in "$workingdir"/*; do 

Dies durchläuft eine Liste der Dateien im Verzeichnis, die dem Wert der Variablen entsprechen workingdir, und funktioniert auch, wenn diese Leerzeichen oder andere lustige Zeichen enthält.

Das zweite Beispiel ist jedoch komplizierter:

if [[ $workingdir == $variable* ]]; then 

In diesem Fall wird der Wert der Variablen variableals Muster und nicht als feste Zeichenfolge behandelt. Wenn beispielsweise variable"* foo" eingestellt wurde, stimmt die Gesamtbedingung überein, wenn $workingdir"foo" irgendwo in ihrem Wert enthalten ist. Wenn Sie $variableeher als wörtliche Zeichenfolge als als Muster behandelt werden *möchten, müssen Sie sie erneut in doppelte Anführungszeichen setzen (jedoch nicht in die Annahme, dass dies als Platzhalter behandelt werden soll):

if [[ $workingdir == "$variable"* ]]; then 

... und ehrlich gesagt, wenn Sie nachverfolgen, wo doppelte Anführungszeichen von Bedeutung sind und wo dies nicht der Fall ist, ist dies mehr Ärger als es wert ist. (dh es ist sicher, sie links =oder ==innen zu lassen, [[ ]]aber nicht rechts oder innen [ ]). Daher empfehle ich einfach, sie überall doppelt zu zitieren, damit Sie nicht so nah dran bleiben müssen:

if [[ "$workingdir" == "$variable"* ]]; then