【问题标题】:Saving directory content to an array (bash) [duplicate]将目录内容保存到数组(bash)[重复]
【发布时间】:2016-04-17 22:04:17
【问题描述】:

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

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。

【问题讨论】:

  • 你确定i=+1?我觉得应该是((i=i+1))
  • 是的。你有权利。当 '((1=i+1))' 修改值时,'i=+1' 将元素添加到数组中。我犯的下一个错误可能是'CONTENT[i]'而不是'CONTENT[$i]'。但是函数仍然返回空数组,问题出在其他地方。
  • 1 = i+1 肯定不是,1 不能是作业的 LHS。 1 永远是 1。
  • 抱歉,我拼错了,现在是欧洲凌晨 5 点 :)。 *'((i=i+1))'
  • 你知道'print $8' 如果文件名中有空格等会失败吗?你能排除这种模式吗?顺便说一句:如果您发布问题的能力受时间影响很大,您应该去睡觉并询问何时再次适合。为什么不使用content=($(ls -l ... '{print $8}') 创建数组?生成数组?

标签: arrays bash directory


【解决方案1】:

one I marked as a duplicate 回答了这个问题的核心。这里还有一些提示:

  • 所有大写的变量名都是discouraged,因为它们更有可能与环境变量发生冲突。
  • 您将一个复杂命令的输出分配给DIRECTORYS(应该是“directories”),该命令存在一些缺陷:
    • 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 来包含它们。

【讨论】:

    【解决方案2】:

    你可以试试

            for((i=0;i<${#CONTENT[*]};i++))
            do
                 echo ${CONTENT[$i]}
            done
    

    而不是 echo $CONTENT

    这些更改也是必需的

         ((i=+1))
         CONTENT[$i]=${DIR} 
    

    在你上面的代码中

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 2017-08-03
      • 2012-07-24
      • 1970-01-01
      相关资源
      最近更新 更多