Satır satır çalışmıyor


1

Senaryo

FILE="/u0146121/bin/list.txt"
while read line; do 
echo $line 
done < $FILE

Ben komut dosyası bash ve döngü sırasında bunu anlamaya çalışıyorum yeniyim. Bir metin dosyasından satır satır okumak ve sonra bir komut yapmak istiyorum.

Hatayı almaya devam ediyorum:

 No such file or directory121/bin/list.txt

Bunun nasıl tamir edileceğini bilen biri var mı?


1
İlkinden echosonra bir saniye eklemeyi denediniz mi? echo $line; echo. Sorununuzu çözmez, ancak tam hata iletisini görmenize izin verebilir. Komut dosyanızla ilgili muhtemelen dosya adından başka hiçbir yanlış göremiyorum.
CVn

Shebang hattını değiştirirseniz ne olur #!/bin/bash -x? ( -xve -vekstra hata ayıklama bilgilerini etkinleştirin).
Hennes

Yanıtlar:


3

Komut dosyanızın DOS tarzı satır sonları olabileceğinden şüpheleniyorum. DOS'ta (ve Windows), bir metin dosyasının her bir satırı satır başı ( veya farklı şekilde \rveya ile temsil edilir ^M) ardından satır satırına ( \nveya ^J) gelir. Unix metin dosyaları ise diğer satırlardaki satırları yalnızca satır beslemeyle sonlandırır. Bir unix aracı (bash gibi) DOS formatlı bir dosya verirseniz, satırbaşının satırın bir parçası olarak yorumlanmasını sağlar ve oldukça karışık olur. Bu durumda, bana FILE'in gerçekten /u0146121/bin/list.txt^Mvar olduğu, var olmadığı ve kabuk sorunu bildirdiği zaman taşıyıcı dönüşü terminali şaşırttığı ve hata mesajının sonunun baştan üzerine basıldığı gibi görünüyor.

Kontrol etmek için, betiğinizi yazdırmayı deneyin cat -v /path/to/script- satırların sonunda ^ M görüyorsanız, bir DOS format dosyanız vardır. (Örneğin bu olabilir Sisteminiz muhtemelen çevirmek için bir komut vardır, ama komut adı değişir dos2unixya fromdos... ya). İlgili bir komut bulamazsanız, bu önemsiz perl komut dosyasını kullanabilirsiniz:

perl -pi -e 's/\r//g' /path/to/script

haklısın ^ M var.
mkrouse

0

Muhtemelen bize tam olarak ne yaptığını göstermiyorsun. Hata mesajı

No such file or directory121/bin/list.txt

ki bunun yerine $FILEiçerdiğini gösterir, aslında sadece koşmadığınızı tahmin edebilirim ama .121/bin/list.txt/u0146121/bin/list.txtFILE="/u0146121/bin/list.txt"FILE="121/bin/list.txt"

Her durumda, çalışıp çalışmadığını görmek için bir değişken tanımlamadan çalıştırmayı deneyin:

while read line; do 
  echo $line;
done < /u0146121/bin/list.txt

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.