Bash:从循环输出

时间:2016-06-30 15:32:07

标签: arrays bash performance loops variables

我有一个'工作'结果。我希望提高效率,改进流程 跟着我,下面:

我正在运行以下脚本:

#!/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该文件。

我已经创建了一个可以实现这一结果的新脚本,但我希望得到批评或更好的方法来实现相同的结果。这种方法似乎很重#34;或需要比所需更多的过程。

脚本:

#!/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

1 个答案:

答案 0 :(得分: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

希望脚本不言自明。