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

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

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

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

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

  • Проблемы копирования файлов с пробелами внутри имени файла в сценарии bash
  • Есть ли в сценарии оболочки функция, эквивалентная var_dump (PHP)
  • извлечение определенных подстрок из строки
  • Повторение общего номера страницы в скрипте Bash
  • Выведите что-нибудь (в цикле) до нажатия клавиши
  • Bash: Групповые строки, содержащие одну и ту же подстроку
  • Добавить текст в командную строку через скрипт оболочки
  • проблема с mysql backup и rsync
  • 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 

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

    Interesting Posts

    Как скопировать из приложения, такого как браузер, в Emacs поверх существующего текста?

    Внедрить Java / JavaFX на ARM

    Я хочу установить библиотеку, которая требует версии python и, имея две установленные, находит неправильную

    Редактирование командной строки vim style

    Экран GNU: перемещение между регионами

    Как настроить мой DNS при перезаписи resolv.conf?

    Результаты поиска для '* .squashfs' для unsquashfs

    Почему я продолжаю уничтожать свои текстовые файлы?

    Файлы Diff dpkg с локальными копиями

    Как удалить теги html из файла с помощью sed?

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

    Latexmk, из Makefile, из скрипта bash, из Cron – Latexmk не выполняется

    FreeBSD + Audio от Realtec ALC883 интегрирован в материнскую плату

    двоичный файл сравнения двух файлов, если только он никогда не совпадает с какой-либо частью второй

    Ubuntu – на устройстве нет места (NTFS)

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