Bourne Shell, döngü tüm verileri döndürürken yapar, ancak iki hata vardır, böyle bir dosya veya dizin yoktur ve kabuk adını tekrarlar.


1

Döngünümün amacı bir dosyanın her satırının ilk basamağını basmaktır. Bu dosya şu:

256-56-8411     Bob     3.61    Junior          CS
471-44-7458     Tim     3.45    Senior          CE
326-56-4286     Rajesh  2.97    Freshman        TE
548-66-1124     Eric    2.88    Sophomore       EE
447-21-3599     John    2.51    Junior          CS
911-41-1256     Rebecca 3.92    Senior          CS
854-22-6372     Robin   2.45    Freshman        TE

Ve betiği çalıştırdıktan sonraki çıktı:

    This is a script that analyses student data from input file students.txt
----------------------------------------------------------------------
./student_script: line 8: 2
4
3
5
4
9
8: No such file or directory
7 is the number of students in the input file.

Ve son olarak, kod:

echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount=`wc -l < $1 `
tempFile=`cut -c1 $1`
while read n
do
echo "$n"
done < $tempFile

echo "$studentCount is the number of students in the input file."

Bunu düzelttikten sonra, ilk hanenin dört olup olmadığını kontrol etmek için while döngüsünü kullanmayı planlıyorum ve sonra kaç tane ID'nin (ilk sütun) 4 ile başlamadığını belirtiyorum.

Yaklaşımımdan sonra daha temiz bir çözüm öğrenmeyi umursamıyorum, ama bu bir sınıf için ve çok fazla şey öğrendiğimizi sanmıyorum. Yolculuğum boyunca awk ile çok benzer şeyler gördüm, ancak henüz awk öğrenemedik.

Ama evet, temelde döngüden istediğim tüm verileri aldım, ancak bu iki ekstra bit ekledi.

Yanıtlar:


1

Bu satırda ne yazdın:

tempFile=`cut -c1 $1`

adı verilen bir dosya oluşturmaz tempFile. Bu nedenle ondan okuyamazsınız.

Bu çizgiyi şu şekilde değiştirebilirsiniz:

cut -c1 "$1" > tempFile

Ve döngünün okuması tempFileiçin bir dosya oluşturulur while read. $tempFileDeğişken $tempfilenull (mevcut değil) olduğundan , bu döngüde kullanmayın . Gibi bir şey kullanın ($):

done < tempFile

Bununla birlikte, basit komut cut -c1 "$1"tüm ilk karakterleri kaynak dosyadan yazacaktır, sadece onu görmek için yürütün:

cut -c1 "sourcefile"

Bunu bilmek, değerleri tutmak için bir tempFile gerekmez, sadece burada bir belge kullanın.

Burada bir doküman kullanmak ve betiğinizdeki diğer bazı problemleri temizlemek:

#!/bin/sh
echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount="$(wc -l < "$1" )"

while read n
do
    echo "$n"
done <<-_avoid_a_file_
$(cut -c1 "$1")
_avoid_a_file_

echo "$studentCount is the number of students in the input file."

Hangi tercümanın kodu çalıştırması gerektiğini belirtmek için bir she-bang (#!) Kullanmak iyi bir uygulamadır. Bu durumda shbahsettiğin için istediğini varsaydım Bourne shell. Orijinal Bourne kabuğunun oldukça eski olduğuna (~ 1979) ve daha yeni mermilere (ksh, bash, mksh, zsh, vb.) Birçok iyileştirme eklendiğini lütfen unutmayın.


Teşekkür ederim! Oldukça hayal kırıklığına uğradım. Sanırım sınıfım birden fazla mermi kullanacak, ama biz bourne ile başladık. Fakat değişiklik sayılan studentCount değişkenimde yanlış olan neydi? Sadece iyi uygulama? Tekrar teşekkürler.
Shawn

@Shawn Bu backticks `...` (şimdi kullanımdan kaldırıldı) $ (....) basit bir değişiklik oldu. Bu tür bir değişimin ayrıntılı nedenini bilmek istiyorsanız , bu cevaptaki POSIX bağlantısını takip etmeniz yeterlidir .

Geri tepmeler onaylanmadı, ancak $(...)eklendi. Bazı mermiler son zamanlarda doğru şekilde desteklenmeye başladı $(...). Bu nedenle, taşınabilirliği elde etmek için iç içe olmayan çağrılar için geri geçiş tuşlarının kullanılması önerilir. Özel olarak $(...), geçerli olarak çalışmayan zsholarak popüler görünüyor.
schily
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.