遍历数组并在变量后附加结果

时间:2019-08-20 02:02:28

标签: bash loops variables

我编写了一个小的bash脚本来搜索文件夹,提取不符合特定条件的文件列表,然后将它们分配给数组。然后,我遍历该数组并将内容输出到stdout。我要做的是将这些结果中的每一个附加到变量中,然后在代码中稍后使用。我正在努力寻找有关如何执行此操作的任何信息。似乎应该超级简单,相当于回声追加类型的东西,但我在网上发现了零个示例。我想要类似的东西:$ list = $ list + $ addition

这是我到目前为止所拥有的。最后一件作品的95%说完了。

    #Declare the array
    array=()

    #Search for any files that are not mp4's. Exclude temp files also.
    while IFS=  read -r -d $'\0'; do
      array+=("$REPLY")
        done < <(find "$movies_dir" -type f -not -name "*.mp4" -not -name "*.srt" -not -name "*.db" -not -name "*.tmp" -not -name "*DS_Store" -not -name "._*" -print0)

    #Create an empty variable to assign the list of movies to
    movie_list=""

    # Loop through array pulling out each movie found    
    if [ ${#array[@]} -gt 0 ]; then
      for i in "${array[@]}"
        do
          movie="${i##*/}"
          echo -n "$movie\n"
        done
    fi

从上面的代码中可以看到,这会将所有电影输出为一个长字符串,用\ n分隔每个文件名(我打算稍后在Slack警报中使用)。考虑到这一点,这就是我需要将文本字符串分配给变量的原因。我希望能够在我的Slack通知中使用它。

有人能指出我实现上述目标的方向吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

如果您要打印文件的换行符分隔列表,则find可以完全通过以下方式处理:

find \
  "$movies_dir" \
  -type f \
  -regextype egrep \
  -not -iregex '.*\.(mp4|srt|db|tmp|_.*|DS_Store)$' \
  -printf '%f\n'

答案 1 :(得分:0)

我不太确定我是否理解这个问题(以及为什么这么困难)。通常,您可以使用var+=addition附加到字符串变量。在这种情况下,唯一棘手的事情是您想要添加变量换行符,而使用相同的引号模式(变量双引号和ANSI模式{ {1}}(换行符)。但是您可以将引号模式混合在单个字符串中,因此这样的方法应该起作用:

$'\n'

(请注意,movie_list="" for i in "${array[@]}"; do movie_list+="${i##*/}"$'\n' done 不需要,因为如果数组为空,则循环将根本不会运行。)

还有其他方法可以避免出现显式循环,例如将ifprintf选项一起使用(输出到变量):

-v

(在这里,请注意if [ ${#array[@]} -gt 0 ]; then printf -v movie_list '%s\n' "${array[@]##*/}" else movie_list="" fi 扩展到数组的所有元素,而[@]##*/每个元素中单独删除。)

或者您可以使用数组的*/扩展,它将数组的所有元素混在一起,并以[*]的第一个字符分隔,您可以将其更改为换行符:

IFS

与此不同的地方是,它不会在元素之间插入换行符。但是,如果您使用saveIFS="$IFS" IFS=$'\n' movie_list="${array[*]##*/}" IFS=$saveIFS 进行打印,则会在末尾附加自己的换行符。