2012-10-29 13 views
28

Jak mogę odczytać zmienną za pomocą while read line?Jak "odczytać" zmienną w pętli while?

Na przykład:

the_list=$(..code..) 

while read line 
do 
     echo $line 

done < $the_list 

stosując powyższy kod daje mi błąd:

./copy.sh: line 25: $the_list: ambiguous redirect 

Odpowiedz

48

Można napisać:

while IFS= read -r line 
do 
    echo "$line" 
done <<< "$the_list" 

Zobacz §3.6.7 "Here Strings" in the Bash Reference Manual.

(Wziąłem również wolność dodając kilka podwójnych cudzysłowów i dodanie -r i IFS= do read, aby uniknąć zbyt dużo mucking z treścią zmiennych.)

+2

Czy 'IFS =' ustawia IFS na znak null? Dlaczego potrzebujesz tego w tym przypadku? – doubleDown

+6

@doubleDown: 'IFS =' ustawia '$ IFS' na pusty ciąg znaków (więc nie zawiera żadnych znaków). W tym przypadku, ponieważ istnieje tylko jedno pole, jego jedynym skutkiem jest uniemożliwienie usunięcia wiodących znaków IFS od początku linii. (Aby zobaczyć, co mam na myśli, porównaj 'przeczytaj foo <<< 'pasek'; echo" $ foo "' z 'IFS = przeczytaj foo <<< 'pasek'; echo" $ foo "'.) – ruakh

15

można po prostu użyć

your_code | while read line; 
do 
    echo $line 
done 

jeśli nie przeszkadza podczas wykonywania pętli w podpowłoce (modyfikowane zmienne nie będą widoczne w obiekcie nadrzędnym po done).

+0

świetnie! wielkie dzięki! –

22

Jeśli nie używać zmienna na cokolwiek innego, można nawet obejść się bez niego:

while read line ; do 
    echo $line 
done < <(... code ...) 
-1

Plik skryptu powinien być w trybie Linux. Poprzednio był w trybie dos. Zmieniłem go, używając dos2unix filename.

np .:

dos2unix sshcopy.sh 

Teraz pracuje dla mnie.

+0

Odpowiedź zaproponowana przez [ruakh] (http://stackoverflow.com/a/13122491/622391) został zaakceptowany przez pytającego. Oznacza to, że problem nie był związany z formatem pliku skryptu. –