Aby odczytać plik tekstowy dosłownie, nie używaj zwykłego read
, który przetwarza dane wyjściowe na dwa sposoby:
read
interpretuje \
jako znak ucieczki; użyj, read -r
aby to wyłączyć.
read
dzieli się na słowa na znaki w $IFS
; ustaw IFS
na pusty ciąg, aby to wyłączyć.
Zwykle idiomem przetwarzającym plik tekstowy wiersz po wierszu jest
while IFS= read -r line; do …
Aby uzyskać wyjaśnienie tego idiomu, zobacz Dlaczego jest while IFS= read
używany tak często zamiast IFS=; while read..
? .
Aby napisać ciąg dosłownie, nie używaj zwykłego echo
, który przetwarza ciąg na dwa sposoby:
- W niektórych powłokach
echo
przetwarza odwrotne ukośniki. (W przypadku bash zależy to od ustawienia xpg_echo
opcji).
- Kilka ciągów traktowanych jest jako opcje, np.
-n
Lub -e
(dokładny zestaw zależy od powłoki).
Przenośnym sposobem drukowania łańcucha jest dosłownie printf
. (Nie ma lepszego sposobu na bash, chyba że wiesz, że twoje wejście nie wygląda jak opcja echo
.) Użyj pierwszego formularza, aby wydrukować dokładny ciąg, a drugiego formularza, jeśli chcesz dodać nowy wiersz.
printf %s "$line"
printf '%s\n' "$line"
Jest to odpowiednie tylko do przetwarzania tekstu , ponieważ:
- Większość pocisków będzie się dusić na znakach zerowych na wejściu.
- Kiedy czytasz ostatni wiersz, nie możesz wiedzieć, czy na końcu był nowy wiersz, czy nie. (Niektóre starsze powłoki mogą mieć większe problemy, jeśli dane wejściowe nie kończą się nową linią).
Nie można przetwarzać danych binarnych w powłoce, ale współczesne wersje narzędzi na większości unikatów radzą sobie z dowolnymi danymi. Aby przekazać wszystkie dane wejściowe do wyniku, użyj cat
. Posiadanie stycznej echo -n ''
jest skomplikowanym i nieprzenośnym sposobem na nic nie robienie; echo -n
byłby równie dobry (lub nie w zależności od powłoki) i :
jest prostszy i w pełni przenośny.
: >| "$file"
cat >>"$file"
lub prościej
cat >|"$file"
W skrypcie zwykle nie trzeba go używać, >|
ponieważ noclobber
domyślnie jest wyłączony.