私が正しい場合、bashでは、readarray
入力はいくつかの区切り文字を使用してフィールドに分割され、区切り文字はデフォルトで改行に設定されます。
区切り記号とは異なり、区切り文字は前のフィールドに含まれています。-t
(toを指定すると、区切りreadarray
文字の代わりに区切り文字になります。)これを確認するためのファイルがあります。
$ cat f10
1
2
3
次のように、前のフィールドに区切り文字(改行)が含まれていないと表示されるのはなぜですか?ありがとうございます。
$ readarray myarr < f10
$ printf "%s" ${myarr[1]}
2$ printf "%s" ${myarr[2]}
3$ printf "%s" ${myarr[0]}
1$
他のファイルがあります。
$ cat f1
1 2 3
2
区切り記号がある場合、その区切り文字が前のフィールドに含まれていることを示しますか? 1と2の間、2と3の間のスペースはなぜ削除されますか?
$ readarray -d 2 myarr < f1
$ printf "%s" ${myarr[0]}
12$ printf "%s" ${myarr[1]}
3$
答え1
readarray
/ はmapfile
終端文字と改行文字をそのままにしますが、デフォルト値を使用するとブレークという単語でIFS
改行文字が失われます。${myarr[0]}
参照変数の拡張では、このようなことは起こりません。
$ cat f10
1
2
3
$ readarray myarr < f10
$ printf "%s" "${myarr[0]}"
1
$ printf "%q\n" "${myarr[0]}"
$'1\n'
$ IFS=
$ printf "%q\n" ${myarr[0]}
$'1\n'
区切り記号とは異なり、区切り文字は前のフィールドに含まれています。
これが普遍的に受け入れられる意味なのかよく分かりません。たとえそれでも回答リンクをリンクして話してください。「物の間に区切り線があります」。これ事前定義その逆を意味します:
区切り記号
1. 定義または分離すること。
カンマ区切りファイルは、カンマを区切り文字として使用して、ファイル内の各フィールドを区切ります。