Щоб читати текстовий файл буквально, не використовуйте звичайний текст 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
він за замовчуванням вимкнено.