По определению текстовый файл состоит из последовательности строк. Строка заканчивается символом новой строки. Таким образом, текстовый файл заканчивается символом новой строки, если он не пустой.
read
Встроенный предназначено только для чтения текстовых файлов. Вы не передаете текстовый файл, поэтому вы не можете надеяться, что он будет работать без проблем. Оболочка читает все строки - пропускаются лишние символы после последней строки.
Если у вас есть потенциально искаженный входной файл, в котором может отсутствовать последняя строка, вы можете добавить в него новую строку, просто чтобы быть уверенным.
{ cat "/tmp/urlFile"; echo; } | …
Файлы, которые должны быть текстовыми файлами, но без последней строки, часто создаются редакторами Windows. Это обычно происходит в сочетании с окончаниями строк Windows, которые являются CR LF, в отличие от Unix LF. Символы CR редко бывают полезными в любом месте и ни в коем случае не могут появляться в URL, поэтому их следует удалить.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
В случае, если входной файл правильно сформирован и заканчивается новой echo
строкой , добавляется дополнительная пустая строка. Поскольку URL не могут быть пустыми, просто игнорируйте пустые строки.
Обратите внимание, что read
строки не читаются простым способом. Он игнорирует начальные и конечные пробелы, что для URL, вероятно, желательно. Он обрабатывает обратную косую черту в конце строки как escape-символ, в результате чего следующая строка соединяется с первой минус последовательность backslash-newline, что определенно нежелательно. Таким образом, вы должны передать -r
опцию read
. Это очень, очень редко, read
чтобы быть правильным, а не read -r
.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done