マニュアルによるとread
(内蔵されているからではありませんがman read
)help read
:
-N nchars
EOF または読み取りタイムアウトが発生しない限り、すべての区切り文字を無視し、正確に NCHARS 文字を読み取った後にのみ返します。
しかし、-N
そのフラグを使用しても、read
入力データから区切り文字を削除したいようです。次のデータを例に挙げます。
# readfail.sh - Reads 5 characters at a time, and adds "RegEx style" start and end characters for clarity
while read -r -N 5 data; do
echo "^${data}\$"
done;
echo "^${data}\$" # There will be data left over just because of the way `read` uses exit codes
出力は次のとおりです。
$ echo -n "Lorem ipsum dolor sit amet" | ./readfail.sh
^Lorem$
^ipsu$
^m dol$
^or si$
^t ame$
^t$
2行目の長さは4文字です。これはLorem
との間にスペースが必要なためですipsum
。これにより、次の5文字が出力されます。^ ipsu$
IFS=
ループの前に設定することでこの問題を解決できました。しかし、そうしてはread
いけません。無視する-N
フラグによる区切り記号はありますか?これはバグですか、それとも意図的な動作ですか?
答え1
-N
行末の区切り文字は無視されます。 Bash は、文字が何であれ、指定された数の文字を正確に読み込みます。これは、読み取った内容がスクリプトに変数の内容として報告される方法とは何の関係もありません。これは一般的なIFS
分割メカニズムを使用します。