bashで行末区切り文字に文字列を分割する方法は?

bashで行末区切り文字に文字列を分割する方法は?

文字列があるとしましょうx

/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file

各ファイルがリストされる配列を取得したいと思います。私の現在のコードは次のとおりです。

readarray -t y <<<"$x"

スペースを含むファイル名を取得する場合を除き、これはうまく機能します(たとえば(copy) file、Readarrayもそれを分割して返すのはy次のような配列です)。

/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy)
file

ファイル名の分割を防ぐ方法は?

答え1

コメントで提案されているように、この質問を終了するには、配列が「分割」されているように見えるのは、配列がreadarrayによって分割されたためではなく、配列を印刷する方法です。配列に実際に何が含まれているのか疑わしい場合は、declare -p印刷用の-pを使用するか、printf二重引用符を使用することをお勧めします。

実際には、変数を印刷してもスクリプトで使用しても、常に二重引用符で変数を引用する必要があります。

次のテストをご覧ください。

$ a="/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file"

$ echo "$a"
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file

$ echo $a
/media/root/persistence/file /media/root/persistence/anotherfile /media/root/persistence/(copy) file

$ readarray -t y <<<"$a"
$ declare -p y
declare -a y=([0]="/media/root/persistence/file" [1]="/media/root/persistence/anotherfile" [2]="/media/root/persistence/(copy) file")

$ printf '%s\n' ${y[@]}
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy)
file

$ printf '%s\n' "${y[@]}"
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file

don_crisstiが述べたように、変数は二重引用符で囲まれていないため、この動作が発生します。

常に変数を引用することの重要性を強調するには、次の追加テストを参照してください。

$ b=" "

$ [ $b = " " ] && echo "ok" || echo "not ok"
bash: [: =: unary operator expected
not ok

$ [ "$b" = " " ] && echo "ok" || echo "not ok"
ok

関連情報