将目录内容保存到数组(bash)

时间:2016-01-13 03:49:16

标签: arrays bash directory

我需要保存数组中两个目录的内容以便稍后进行比较。这就是我写的解决方案:

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。

2 个答案:

答案 0 :(得分:1)

one I marked as a duplicate回答了这个问题的核心问题。以下是一些指示:

  • 所有大写变量名称都是discouraged,因为它们更可能与环境变量冲突。
  • 您将DIRECTORYS(可能应该是“导演 ies ”)分配给复杂命令的输出,该命令存在一些缺陷:
    • 而不是var=`command`中的反引号,语法var=$(command)preferred
    • egrepdeprecatedgrep -E为首选。
    • grep和awk命令可以合并到awk /^d/ '{ print $8 }'
    • 有更好的方法来获取目录,例如find,但不应解析find的输出。
    • You shouldn't process the output of 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} 

在上面的代码中