2017-01-13 1 views
0

Warum die Felder anders in diesen beiden Fällen analysiert werden:warum Parsen unterscheidet sich in dieser bash for-Schleife Beispiel

  1. for u in $(echo "a b c"); do echo $u; done 
    a 
    b 
    c 
    
  2. for u in "a b c"; do echo $u; done 
    a b c 
    

Im zweiten Fall, ich bin es gewöhnt, dazu. Ich kann IFS ändern, um das Feld mit Leerzeichen zu analysieren. Aber im ersten Fall, warum funktioniert es, um Whitespace zu analysieren?

+1

Das Ergebnis der Befehlssubstitution wird wortaufgeteilt weil es keine Anführungszeichen gibt, um es zu verhindern. 'für dich in" $ (echo a b c) "; echo $ u; erledigt 'würde das gleiche Ergebnis wie der zweite Fall ergeben. – alvits

+0

Großartig, danke. Macht Sinn. – michael

Antwort

-1

Wenn eine Befehlsersetzung durchgeführt wird, kann die Worttrennung zweimal auftreten, einmal innerhalb der Befehlsersetzung und einmal außerhalb. Bei Anführungszeichen wird das Teilen von Wörtern für beides verhindert. Sie müssen jedoch die Befehlsersetzung angeben, um zu verhindern, dass das Ergebnis in diesem Fall aufgeteilt wird.

Drei Beispiele:

set -- "a b c" 
echo $# 
1 

Wort Spaltung durch die Anführungszeichen in diesem Fall verhindert wird.

set -- $(echo "a b c") 
echo $# 
3 

Im zweiten Fall wird $(...) durch a b c Aber jetzt ersetzt, ist dies nicht mehr zitiert, so dass es noch einmal unter Wort Spaltung ist.

Wenn wir uns bewegen, die Anführungszeichen zu außerhalb des Befehls Substitution, das Ergebnis von echo erneut als ein einziger Eintrag interpretiert wird:

set -- "$(echo a b c)" 
echo $# 

Dieses auch als

geschrieben werden konnte
set -- "$(echo "a b c")" 
echo $# 

In jedem Fall verhindern die äußeren Anführungszeichen die äußere Worttrennung. Ob die Wortaufteilung im Inneren erfolgt, ist hier nicht relevant.

+0

Betrachte '$ (echo \" a b c \ ")'; das "wird die Zitate nicht los". – melpomene

+0

@melpomene Ich habe im Original keine Backslashes gesehen, also sehe ich nicht, wie das relevant ist. –

+0

Es ist ein Gegenbeispiel zu Ihrer Erklärung. 'echo \" a b c "" gibt "" a b c "' aus (einschließlich der Anführungszeichen), aber es wird immer noch in drei Teile aufgeteilt. Deine Erklärung kann also nicht stimmen. – melpomene

4

Der unquoted Befehl Substitution erfährt Wort-Splitting, das gleiche wie wenn Sie

fake_list=$(echo "a b c") 
for u in $fake_list; do echo $u; done 
1

Diese zusätzliche double quotes um $(echo "a b c") benutzt hatte, würde das Wort Spaltung verhindern:

for u in "$(echo "a b c")"; do echo $u; done 

Ausgabe

a b c 
Verwandte Themen