文字列があるとしましょう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