Powiedz, że mam ten plik:
hello
world
hello world
Ten program
#!/bin/bash
for i in $(cat $1); do
echo "tester: $i"
done
wyjścia
tester: hello
tester: world
tester: hello
tester: world
Chciałbym, aby for
iteracja nad każdą linią była indywidualnie ignorowana spacje, tzn. Ostatnie dwie linie powinny zostać zastąpione przez
tester: hello world
Użycie cudzysłowów for i in "$(cat $1)";
powoduje i
przypisanie całego pliku na raz. Co powinienem zmienić?
źródło
<
zapętlić całą pętlę. Chociaż teraz ma to sens, teraz to widziałemIFS \ read -r line' in second example. Is really
IFS = `potrzebne? IMHO wystarczy powiedzieć:while read -r line; do echo "tester: $line"; done < "$1"
IFS=
wyłącza usuwanie wiodących i końcowych białych znaków. Patrz Wwhile IFS= read..
, dlaczego IFS mają żadnego wpływu?Aby to było warte, muszę to robić dość często i nigdy nie pamiętam dokładnego sposobu użycia
while IFS= read...
, dlatego w moim profilu bash zdefiniowałem następującą funkcję:Ta funkcja określa najpierw liczbę wierszy w pliku, a następnie używa
sed
do wyodrębnienia linii po linii i przekazuje każdą linię jako argument pojedynczego łańcucha do dowolnej funkcji. Podejrzewam, że może to stać się naprawdę nieefektywne w przypadku dużych plików, ale jak dotąd nie stanowiło to dla mnie problemu (oczywiście sugestie, jak poprawić to powitanie).Zastosowanie jest całkiem słodkie IMO:
źródło