如何在bash脚本中将整个段落存储为数组的一个元素

如何在bash脚本中将整个段落存储为数组的一个元素

我使用以下代码从文件中读取数据abcd.txt 并尝试存储在数组中parameters,我能够存储619617parameter[0]update中,parameters[1]parameters[2]我无法获取整个证书。请帮助我如何实现这一目标:

    filename="/home/abcd.txt"
    i=1
    index=0
        while read -r line
        do
            i=$line
            parameters[$index]=$(echo $i | awk -F'=' '{print $2}')
            i=$((i+1))
            index=$((index+1))
            if [ "$index" == "3" ]
             then
                break
            fi
        done < "$filename"
        echo ${parameters[0]} ${parameters[1]} ${parameters[2]}
#       python /opt/symstream/bin/configure.py ${parameters[0]} ${parameters[1]} ${parameters[2]}

文件名包含以下数据:

cat abcd.txt

serial_no=619617
action=update
certificate=-----BEGIN CERTIFICATE-----
MIIDaTCCAlGgAwIBAgIJAPwqZH3OF7E4MA0GCSqGSIb3DQEBBQUAMEsxCzAJBgNV
BAYTAklOMRIwEAYDVQQKDAlTeW1zdHJlYW0xDDAKBgNVBAsMA1JuRDEaMBgGA1UE
AwwRcGMxLnN5bXN0cmVhbS5jb20wHhcNMTUwNzAzMDQ0ODE2WhcNMjUwNzAzMDQ0
ODE2WjBLMQswCQYDVQQGEwJJTjESMBAGA1UECgwJU3ltc3RyZWFtMQwwCgYDVQQL
DANSbkQxGjAYBgNVBAMMEXBjMS5zeW1zdHJlYW0uY29tMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEA2CJtHYzvIAc7vX9l3Dw5VInEsY4WBjvch/CWSWEW
Xm3QMKadXaBoamOdjKXaowW//dXAYjf4d6vH3h+f9dpzcTkf7oN8pYin6DiXYZJK
CCL7u4hOY0eIq02OJcZwl/qhms+bmxTPN8ph+qnRIot7NzxnkT4AyyPyvGLtSLL6
4E1NGBWZF7JLJKwuvHuMYC2dYHYdBie2G9rczel09hteaoeaulRyWo+sKiFQRO15
XQWfEWfcZhaLHDkNbR+1K/YctuZwFvXPUjC8RFmRptz8n2ZqT1uYrTxKFAXcg/Cp
/DFRV3Q/6/pYWf8u1u2v1Mg5MXdZnjf4jTNUJcmJQiJAsQIDAQABo1AwTjAdBgNV
HQ4EFgQU9snp1dOf74Af6619J838d3jjuAAwHwYDVR0jBBgwFoAU9snp1dOf74Af
6619J838d3jjuAAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAZWrs
icxkOBOrw2oJQ04fibtw/gfaaGeHWQA73s+nsFtgI9TbpzGt1HWcESuJfEeg7XDd
gKOU2MNcQE6pIi1qjX104R5o66Covco4K1bZdvBmiKJdXNkoECOoXpupWaq+KoVY
Px1d1Yv697+q2dmtGG3ThlfJeKdmCx4X/miajK5Mbota49DTFFckba9RsSBottfd
74VIUcw581A9W3b9C5lk8bcvQfWsdnJAMwN5ktrIcVyp29ti5tdLPEXKmCZcFq/z
KKl2+HPKd8m5t2BaJn6wkPd3Qj1dZQ5kLlgKJg9IbWD6+S1MaOHNDvH8o1Z29dEY
Jv/a5hmEAJ8BX4v9Cw==
-----END CERTIFICATE-----

答案1

问题是while read您正在逐行读取文件。由于证书分布在多行中(带有明确的换行符),因此您不能像以前那样简单地读入它。如果所有文件都是这样并且没有多个证书或任何其他内容,您可以这样做:

删除第 1 行和第 2 行,删除certificate=文件的其余部分并将其作为数组元素读取(然后使用 删除换行符tr)。

arr[2]="$(sed '1,2d;s/certificate=//' abcd.txt | tr -d '\n' )"

老实说,我也不认为循环遍历具有不同复杂性的三个元素没有帮助。因此前两个元素就是:

arr[0]="$( awk -F'=' 'NR == 1 { print $2 }' abcd.txt )"

(与第二个元素相同NR == 2)或与sed上面

arr[0]="$(sed -n '1s/.*=//p' abcd.txt)"

(第二个元素与 相同2s...

答案2

mapfile -t parameters < <(sed '1,4s/.*=//' abc)
parameters[2]=$(printf '%s\n' "${parameters[@]:2}")

相关内容