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