при чтении строки в сценарии оболочки – как остановить цикл?

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

while read line do wget -x "http://someurl.com/${line}.pdf" -o ${line}.pdf done < inputfile 

Однако этот скрипт продолжает работать с $ -ой строкой, не содержащей никакого значения. Как мне изменить код, который скрипт останавливает, если следующая строка пуста или какое-то слово «сигнал».

спасибо за помощь

  • Поиск строки в выводе команды
  • Команда Killall?
  • Конкатенация двух полей из двух файлов
  • bash не сравнивает имена файлов с правильно
  • Shell: выбор доступной программы
  • Как я могу выполнить и прервать скрипт в цикле
  • Сортировка фотографий с использованием сценария оболочки
  • В чем смысл if ;?
  • 3 Solutions collect form web for “при чтении строки в сценарии оболочки – как остановить цикл?”

    Вот как бы вы остановили while-loop на нулевом значении line :

     #!/usr/bin/bash while read line do if [[ -z $line ]] then exit fi wget -x "http://someurl.com/${line}.pdf" done < inputfile 

    Я думаю, что ваша реальная проблема может заключаться в непревзойденном символе двойной кавычки до «http» или в непревзойденном обратном тике в конце «inputfile». Вы должны очистить цитату перед тем, как попробовать мой пример кода.

      while read line && [ "$line" != "quit" ]; do # ... 

    Или остановиться на пустой строке:

      while read line && [ "$line" != "" ]; do # ... 

    или

      while read line && [ -n "$line" ]; do # ... 

    По другой теме:

     "http://someurl.com/$line.pdf" -o "$line.pdf" 

    вам не нужны колышки, но вы должны использовать двойные кавычки вокруг последнего расширения переменной.

      line=\ ; PS4='${#line}: + ' while read line <&$((${#line}?0:3)) do : "$line" done <<msg 3</dev/null one nice thing about allowing shell expansions to self test is that the shell already has mechanisms in place for the evaluation. its doing it all the time anyway. theres almost nothing for you to do but to let it fall into place. For example: ${line##*[ :: i doubt very seriously the shell will read any of this :: ]*} msg 

     1: + read line 59: + : 'one nice thing about allowing shell expansions to self test' 59: + read line 58: + : 'is that the shell already has mechanisms in place for the' 58: + read line 59: + : 'evaluation. its doing it all the time anyway. theres almost' 59: + read line 52: + : 'nothing for you to do but to let it fall into place.' 52: + read line 12: + : 'For example:' 12: + read line 0: + : '' 0: + read line 

    Кроме того, для немедленного перерыва при чтении пустой строки …

     while read line && ${line:+":"} break do : stuff done 

    … будет работать хорошо.

    Linux и Unix - лучшая ОС в мире.