Щоб читати текстовий файл буквально, не використовуйте звичайний текст read, який обробляє вихід двома способами:
readтрактує \як втечу персонажа; використовувати, read -rщоб вимкнути це.
readрозбивається на слова на символи в $IFS; встановити IFSпорожню рядок, щоб вимкнути це.
Звичайна ідіома для обробки текстового файлу рядок за рядком - це
while IFS= read -r line; do …
Для пояснення цієї ідіоми див. Чому while IFS= readвикористовується так часто замість IFS=; while read..? .
Щоб писати рядок буквально, не використовуйте просто echo, який обробляє рядок двома способами:
- На деяких оболонках
echoобробляється зворотний косий рядок. (Від bash, це залежить від того, чи встановлений xpg_echoваріант.)
- Кілька рядків розглядаються як варіанти, наприклад,
-nабо -e(точний набір залежить від оболонки).
Портативний спосіб друку рядка буквально за допомогою printf. (Немає кращого способу в bash, якщо ви не знаєте, що ваш вклад не виглядає як варіант echo.) Для друку точного рядка використовуйте першу форму, а другу, якщо ви хочете додати новий рядок.
printf %s "$line"
printf '%s\n' "$line"
Це підходить лише для обробки тексту , оскільки:
- Більшість оболонок задихаються від нульових символів на вході.
- Прочитавши останній рядок, ви не можете дізнатися, чи був новий рядок наприкінці чи ні. (У деяких старих оболонок можуть виникнути більші проблеми, якщо введення не закінчується новим рядком.)
Ви не можете обробляти бінарні дані в оболонці, але сучасні версії утиліт для більшості юніків можуть впоратися з довільними даними. Щоб передати весь вхід до виходу, використовуйте cat. Їхати по дотичній echo -n ''- це складний і непереносний спосіб нічого не робити; echo -nбуло б настільки ж добре (або не залежно від оболонки), і :є більш простим і повністю портативним.
: >| "$file"
cat >>"$file"
або, простіше,
cat >|"$file"
У сценарії зазвичай не потрібно використовувати, >|оскільки noclobberвін за замовчуванням вимкнено.