【问题标题】:Bash: create multiple arrays from loop outputBash:从循环输出创建多个数组
【发布时间】:2016-06-30 15:32:06
【问题描述】:

我有一个“有效”的结果。我想让它更有效率,改进流程。
跟着我,在下面:

我正在运行以下脚本:

#!/bin/bash
varPATH+=($(find /usr/share/doc/nano/ -maxdepth 1 -type f -readable))
for i in ${varPATH[@]} ; do
        md5sum $i | sed 's/\.\///g'
done

...输出...

3d4b12cf0073d9aeebbf29e661fd5da5  AUTHORS
bf9b099648cb1200eb2fa4434c3c4547  BUGS.gz
c7dcba1d8e5a6e0a88ced9929b2630ae  changelog.Debian.gz
d2b7963b6bcf44a590001e7c5b0ef8a8  changelog.gz
e70e5c9b500efd2a540c999dceb8f06c  copyright
aa867595b2958564c4b32ed6ea591cd7  faq.html
99724dc74c18b19a5433ac3624258e56  NEWS.gz

我希望将 md5sum 添加到 array1 并将文件名添加到 array2

如果我循环遍历两个数组的序列,array1[22] 和 array2[22] 会相应地匹配,但也不必多次对文件进行 MD5。

我创建了一个可以实现此结果的新脚本,但我希望获得批评或更好的方法来实现相同的结果。这种方法看起来“繁重”或需要比需要更多的过程。

脚本:

#!/bin/bash
varPATH+=($(find /usr/share/doc/nano/ -maxdepth 1 -type f))
unset ar1; unset ar2; unset ar3; unset ar4; unset ar5
bentest ()      {
                for i in ${varPATH[@]} ; do
                        md5sum $i | sed 's/\.\///g'
                done
                }
ar1+=($(bentest))
count1=0
count2=1
while [ $count1 -lt ${#ar1[@]} ]; do
        ar2+=($(echo ${ar1[$count1]}))
        ar4+=($count1)
        let count1+=2
done

while [ $count2 -lt ${#ar1[@]} ]; do
        ar3+=($(echo ${ar1[$count2]}))
        ar5+=($count2)
        let count2+=2
done

count3=0
count4=0
count5=0
while [ $count3 -lt ${#ar1[@]} ]; do
        echo "ar1[$count3] = ${ar1[$count3]}"
        let count3+=1
done
while [ $count4 -lt ${#ar2[@]} ]; do
        echo "ar2[$count4] = ${ar2[$count4]}"
        let count4+=1
done
while [ $count5 -lt ${#ar3[@]} ]; do
        echo "ar3[$count5] = ${ar3[$count5]}"
        let count5+=1
done

...显示此方法的输出是正常的...

ar1[0] = aa867595b2958564c4b32ed6ea591cd7
ar1[1] = /usr/share/doc/nano/faq.html
ar1[2] = e70e5c9b500efd2a540c999dceb8f06c
ar1[3] = /usr/share/doc/nano/copyright
ar1[4] = d2b7963b6bcf44a590001e7c5b0ef8a8
ar1[5] = /usr/share/doc/nano/changelog.gz
ar1[6] = 3d4b12cf0073d9aeebbf29e661fd5da5
ar1[7] = /usr/share/doc/nano/AUTHORS
ar1[8] = 9319db0df664b9fcfe6937b78666c607
ar1[9] = /usr/share/doc/nano/UPGRADE.gz
ar1[10] = 99724dc74c18b19a5433ac3624258e56
ar1[11] = /usr/share/doc/nano/NEWS.gz
ar1[12] = bf9b099648cb1200eb2fa4434c3c4547
ar1[13] = /usr/share/doc/nano/BUGS.gz
ar1[14] = 54cdb409a70b74d1a8b41a731e0d9ef5
ar1[15] = /usr/share/doc/nano/THANKS
ar1[16] = c7dcba1d8e5a6e0a88ced9929b2630ae
ar1[17] = /usr/share/doc/nano/changelog.Debian.gz
ar1[18] = 2864bac6c4e3e9264a8a68509e511e81
ar1[19] = /usr/share/doc/nano/TODO.gz
ar1[20] = a4ee8fd431a8db6cc84a7fb6c29931b9
ar1[21] = /usr/share/doc/nano/README
ar2[0] = aa867595b2958564c4b32ed6ea591cd7
ar2[1] = e70e5c9b500efd2a540c999dceb8f06c
ar2[2] = d2b7963b6bcf44a590001e7c5b0ef8a8
ar2[3] = 3d4b12cf0073d9aeebbf29e661fd5da5
ar2[4] = 9319db0df664b9fcfe6937b78666c607
ar2[5] = 99724dc74c18b19a5433ac3624258e56
ar2[6] = bf9b099648cb1200eb2fa4434c3c4547
ar2[7] = 54cdb409a70b74d1a8b41a731e0d9ef5
ar2[8] = c7dcba1d8e5a6e0a88ced9929b2630ae
ar2[9] = 2864bac6c4e3e9264a8a68509e511e81
ar2[10] = a4ee8fd431a8db6cc84a7fb6c29931b9
ar3[0] = /usr/share/doc/nano/faq.html
ar3[1] = /usr/share/doc/nano/copyright
ar3[2] = /usr/share/doc/nano/changelog.gz
ar3[3] = /usr/share/doc/nano/AUTHORS
ar3[4] = /usr/share/doc/nano/UPGRADE.gz
ar3[5] = /usr/share/doc/nano/NEWS.gz
ar3[6] = /usr/share/doc/nano/BUGS.gz
ar3[7] = /usr/share/doc/nano/THANKS
ar3[8] = /usr/share/doc/nano/changelog.Debian.gz
ar3[9] = /usr/share/doc/nano/TODO.gz
ar3[10] = /usr/share/doc/nano/README

【问题讨论】:

  • 你想要的最终效果是什么?
  • 我正在构建一个脚本,我可以针对一个目录运行该脚本以自动生成 apache 文件描述。

标签: arrays bash performance loops variables


【解决方案1】:

一种对我有用的简单方法,它遍历原始脚本的输出,该脚本使用文件名创建哈希码:-

#!/bin/bash

md5sumArray=()
nameArray=()
while read -r md5sum name;
do
    md5sumArray+=("$md5sum")
    nameArray+=("$name")
done < <(find /usr/share/doc/nano/ -maxdepth 1 -type f -exec bash -c 'file={}; md5sum $file | sed "s/\.\///g"' \;)

有了这个,您不再需要另一个脚本来填充包含md5sum 的数组。

您可以稍后通过打印它们来测试您的数组,如下所示:-

for element in "${md5sumArray[@]}"
do
    echo "$element"
done

for element in "${nameArray[@]}"
do
    echo "$element"
done

希望脚本不言自明。

【讨论】:

  • 这很好,但是您答案中代码的顶部要求我最初创建的脚本中的代码。在我下面的代码中:for i in ${varPATH[@]} ; do md5sum $i | sed 's/\.\///g'; done 我希望看到上面的命令被馈送到两个数组中,而不必创建第三个数组
  • @Benjamin:参考我更新的答案并提供您的建议。
  • 这太好了,谢谢。 done &lt; &lt;(find /usr/share/doc/nano/ -maxdepth 1 -type f -exec bash -c 'file={}; md5sum $file | sed "s/\.\///g"' \;)这种bash我用的不多,多多练习,谢谢
猜你喜欢
  • 2023-04-01
  • 2021-12-27
  • 2016-11-22
  • 2019-12-29
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
相关资源
最近更新 更多