Bash]1 ile bir metin dosyasının her satırında nasıl yineleme yapabilirim?
Bu senaryo ile:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
Ekranda bu çıktıyı alıyorum:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(Daha sonra $p
ile sadece ekrana çıktı vermekten daha karmaşık bir şey yapmak istiyorum).
Ortam değişkeni SHELL (env'den):
SHELL=/bin/bash
/bin/bash --version
çıktısı:
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
cat /proc/version
çıktısı:
Linux version 2.6.18.2-34-default (geeko@buildhost) (gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)) #1 SMP Mon Nov 27 11:46:27 UTC 2006
Peptides.txt dosyası şunları içerir:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
Bunu yapmanın bir yolu:
while read p; do
echo "$p"
done <peptides.txt
Yorumlarda belirtildiği gibi, bunun baştaki boşlukları kırpma, ters eğik çizgi dizilerini yorumlama ve sonlandırıcı bir satır beslemesi eksikse son satırı atlama gibi yan etkileri vardır. Bunlar endişe yaratıyorsa, yapabilirsiniz:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
İstisnai olarak, döngü gövdesi standart girdiden okuyabilir ise, dosyayı farklı bir dosya tanımlayıcısı kullanarak açabilirsiniz:
while read -u 10 p; do
...
done 10<peptides.txt
Burada, 10 sadece keyfi bir sayıdır (0, 1, 2'den farklı olarak).
cat peptides.txt | while read line
do
# do something with $line here
done
ve tek satırlık varyant:
cat peptides.txt | while read line; do something_with_$line_here; done
Bu seçenekler, sonda satır beslemesi yoksa dosyanın son satırını atlayacaktır.
Aşağıdakileri yaparak bundan kaçınabilirsiniz:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Seçenek 1a: While döngüsü: Her seferinde tek satır: Girdi yeniden yönlendirme
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
Seçenek 1b: While döngüsü: Her seferinde tek satır: Dosyayı açın, bir dosya tanımlayıcısından okuyun (bu durumda dosya tanımlayıcısı #4).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done