1

скрипт

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

Я новичок в сценариях Bash и пытаюсь выяснить это в то время как цикл. Я хочу читать построчно из текстового файла, а затем выполнить команду.

Я продолжаю получать ошибку:

 No such file or directory121/bin/list.txt

Кто-нибудь знает, как это исправить?

3 ответа3

3

Я подозреваю, что ваш сценарий может иметь окончания строки в стиле DOS. В DOS (и Windows) каждая строка текстового файла заканчивается возвратом каретки (по-разному обозначается как \r или ^M), за которым следует перевод строки (\n или ^J). Текстовые файлы Unix, с другой стороны, заканчивают каждую строку простым переводом строки. Если вы дадите Unix-инструменту (например, bash) файл в формате DOS, он будет интерпретировать возврат каретки как часть строки и запутается. В этом случае мне кажется, что FILE фактически устанавливается в /u0146121/bin/list.txt^M , которого не существует, и когда оболочка сообщает о проблеме, возврат каретки приводит в замешательство терминал и конец сообщение об ошибке печатается поверх начала.

Чтобы проверить, попробуйте напечатать ваш скрипт с помощью cat -v /path/to/script - если вы видите ^ M в конце строк, у вас есть файл в формате DOS. Возможно, в вашей системе есть команда для ее перевода, но имя команды может быть другим (например, это может быть dos2unix или fromdos или ...). Если вы не можете найти соответствующую команду, вы можете использовать этот тривиальный скрипт на Perl:

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

Вы, вероятно, не показывает нам, что именно вы делаете. Сообщение об ошибке

No such file or directory121/bin/list.txt

который показывает, что $FILE содержит 121/bin/list.txt вместо /u0146121/bin/list.txt поэтому я могу только догадываться, что вы на самом деле не используете FILE="/u0146121/bin/list.txt" а FILE="121/bin/list.txt" .

В любом случае, попробуйте запустить его без определения переменной, чтобы увидеть, работает ли она:

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

Пытаться

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .