繁体   English   中英

Bash:从循环输出创建多个数组

[英]Bash: create multiple arrays from loop output

我有一个“工作”结果。 我想提高效率,完善流程。
跟随我,如下:

我正在运行以下脚本:

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

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

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

希望脚本是不言自明的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM