我需要保存数组中两个目录的内容以便稍后进行比较。这就是我写的解决方案:
DirContent()
{
#past '$1' directorys to 'directorys'
local DIRECTORYS=`ls -l --time-style="long-iso" $1 | egrep '^d' | awk '{print $8}'`
local CONTENT
local i
for DIR in $DIRECTORYS
do
i=+1
CONTENT[i]=${DIR}
done
echo $CONTENT
}
然后当我尝试打印这个数组时,我得到空输出。两个目录都不是空的。请告诉我这里我做错了什么。 谢谢,Siery。
答案 0 :(得分:1)
one I marked as a duplicate回答了这个问题的核心问题。以下是一些指示:
DIRECTORYS
(可能应该是“导演 ies ”)分配给复杂命令的输出,该命令存在一些缺陷:
var=`command`
中的反引号,语法var=$(command)
为preferred。egrep
为deprecated,grep -E
为首选。awk /^d/ '{ print $8 }'
。find
,但不应解析find
的输出。ls
programmatically:文件名可以包含空格,换行符,其他特殊字符...... DIRECTORYS
现在只是一个长字符串,您依靠word splitting来迭代它。同样,文件名中的空格会让你失望。DIR
未声明为local
。i
,您需要使用(( ++i ))
。CONTENT[i]=${DIR}
实际上没问题:i
会在此自动展开,而不必由$
作为前缀。通常你想quote你的变量如"$dir"
,但在这种情况下我们碰巧知道它不会被进一步拆分,因为它已经 结果分词。content+=("$dir")
附加到数组,而不是使用计数器。echo "${CONTENT[@]}"
。但是真的,你应该做什么而不是所有这些:一个电话DirContent some_directory
相当于echo some_directory/*/
,如果你想要一个数组,你会只需使用
arr=(some_directory/*/)
而不是整个功能 - 这甚至适用于奇怪的文件名。而且要短得多。
如果您有隐藏目录(名称以.
开头),您也可以使用shopt -s dotglob
来包含它们。
答案 1 :(得分:0)
你可以尝试
for((i=0;i<${#CONTENT[*]};i++))
do
echo ${CONTENT[$i]}
done
而不是echo $ CONTENT
此外,还需要进行这些更改
((i=+1))
CONTENT[$i]=${DIR}
在上面的代码中