在linux shell脚本中我试图将find的输出设置为数组,如下所示
#!/bin/bash arr=($(find . -type -f))
但是它会给出错误,因为-type应该只包含一个字符。任何人都可以告诉我问题在哪里。
由于
答案 0 :(得分:1)
如果您使用bash
4,readarray
命令可以与进程替换一起使用。
readarray -t arr < <(find . -type f)
正确支持所有文件名,包括那些包含换行符的文件名,需要更多工作,以及支持find
的{{1}}版本:
-print0
答案 1 :(得分:0)
我建议使用以下脚本:
#!/bin/bash
listoffiles=$(find . -type f)
nfiles=$(echo "${listoffiles}" | wc -l)
unset myarray
for i in $(seq 1 ${nfiles}) ; do
myarray[$((i-1))]=$(echo "${listoffiles}" | sed -n $i'{p;q}')
done
因为你不能通过myarr=( one two three )
语法依赖Bash自动数组实例化,因为它在括号内看到的所有空格(包括空格)都是一样的。所以你必须手动处理生成的多行变量listoffiles
种类,我在上面的脚本中做了什么。
echo
选项的 -n
会在变量的最后打印一个尾随的换行符,但在我们的情况下这很好,因为find
没有(&{t}}您可以使用echo -n "${listoffiles}"
)进行检查。
我使用 sed 来提取相关的第i行,其中$i
被shell解释,然后被赋予 sed 作为第一行自己剧本的特征。