在Bash中无法获取包含空格的文件名数组的问题
在Bash中无法获取包含空格的文件名数组的问题
我想写一个bash脚本,需要获取目录中的文件名,我已经这样做了:
list=`ls -p -m -1 $dir | grep -v /` list=`echo $list | tr ' ' ','` IFS=',' read -ra list_array <<< $list
如果当前目录中不存在带有空格的文件,则变量list_array
保存了正确的以空格分隔的文件名数组:
$ echo "${list_array[*]}" a a.rar a.tar a.zip blah blah blah
但是,在存在文件名中带有空格的情况下,这种方法将无法正确工作。为了解决这个问题,我将其改为了以下方式:
list=`ls -p -m $dir | grep -v /` #这种方法对于没有空格的文件名无效 IFS=',' read -ra list_array <<< $list
但现在list_array
只保存了第一个文件的名称。
非常感谢您的帮助。
问题出现的原因是在Bash中无法获取包含空格的文件名的数组。这是因为Bash默认以空格作为分隔符,并且无法正确处理包含空格的文件名。
为了解决这个问题,可以使用换行符作为IFS(Internal Field Separator,内部字段分隔符)。通过将IFS设置为$'\n',可以告诉Bash使用换行符作为分隔符,从而正确处理包含空格的文件名。
下面是解决该问题的代码:
IFS=$'\n' list_array=(`ls -p -m -1 . | grep -v /`)
在以上代码中,首先将IFS设置为$'\n',然后使用ls命令获取当前目录下的所有文件名,并使用管道将结果传递给grep命令。grep命令的-v选项用于排除所有以斜杠结尾的行,即排除文件夹。最后,将结果存储到名为list_array的数组中。
通过以上代码,就可以正确获取包含空格的文件名的数组了。这样就解决了在Bash中无法获取包含空格的文件名的问题。