7

私はこの投稿を読んでいます: 配列内にスペースを含む任意のテキストを処理できるかどうかを確認するために、null で区切られた文字列変数でループする bash "for in" 。

上記の投稿に基づいて、これは正常に機能します。

while IFS= read -r -d '' myvar; do echo $myvar; done < <(find . -type f -print0)

私の理解を確認するために、これも行いました(それでも問題なく動作します):

while IFS= read -r -d '' myvar; do echo $myvar; done < <(printf "%s\0" 'a b' 'c d')

ただし、出力を配列に格納しようとすると、うまくいきません。

IFS= read -r -d '' -a myvar < <(printf "%s\0" 'a b' 'c d')

配列は以下のみa bを保持し、以下を保持しませんc d:

echo ${myvar[@]}
a b

どうやら、私がここで見逃している詳細があります。助けてくれてありがとう。

PS。私は走っています:

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14)
Copyright (C) 2007 Free Software Foundation, Inc.
4

1 に答える 1

12

bash4.4 では、コマンドreadarray-dの同じオプションに類似したオプションが追加されましたread

$ IFS= readarray -d '' myvar < <(printf "%s\0" 'a b' 'c d')
$ printf "%s\n" "${myvar[@]}"
a b
c d

以前のバージョンをサポートする必要がある場合は、出力を明示的にループする必要があります。

while IFS= read -d '' line; do
    myvar+=( "$line" )
done < <(printf "%s\0" 'a b' 'c d')
于 2016-01-01T14:34:46.397 に答える