如何在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

相关内容