代码之家  ›  专栏  ›  技术社区  ›  enodmilvado

在这种情况下,我们需要清除bash脚本中的数组

  •  0
  • enodmilvado  · 技术社区  · 8 年前

    在下面的示例中,我们设置数组变量- \u数组中的files\u ,以及在/tmp下捕获的所有查找命令的xml文件

    注意-我们使用第二个“(”“)”来创建数组

    files_in_array=( $( find /tmp -type f -name '*.xml' ) )
    

    现在我们可以捕获第一个/第二个值。。等等,如下所示

    echo ${files_in_array[0]}
    
    /tmp/demo_values.xml
    
    
    echo ${files_in_array[1]}
    
    /tmp/prod_values.xml
    

    直到现在一切都很完美

    但我不确定是否需要清除阵列

     files_in_array=()
    

    那么,在bash脚本中使用数组之前,我们必须清除数组吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Nahuel Fouilleul    8 年前

    与变量类似,数组是在shell流程环境中定义的,与变量不同,它们不能导出以在子流程中访问。

    你发出的第一个命令

    files_in_array=( $( find /tmp -type f -name '*.xml' ) )
    

    初始化数组如果数组中的files\u包含数据,则会将其清除。

    正如评论中所说,这不是一种像您那样初始化阵列的安全方法,因为在进程扩展之后 $(..) 结果是在空格选项卡和换行符上拆分,文件名可以拆分为元素,一种安全的方法是使用glob文件扩展,因为它发生在之后,不会被拆分。 所以只要

    files_in_array=( /tmp/*.xml )
    

    获取所有子路径

    shopt -s globstar
    shopt -s nullglob
    files_in_array=( /tmp/**/*.xml )
    

    bash 4.0之前

    正如评论中所说,globstar是在Bash4.0中引入的,在此之前,它是使用find-print0实现的另一种方法

    files_in_array=(  )
    while IFS= read -d '' -r file; do
        files_in_array+=( "$file" )
    done < <( find /tmp -type f -name '*.xml' -print0 )