假设我有字符串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