Shell脚本数组未打印正确的值

时间:2018-12-04 02:03:45

标签: bash

我有这个简单的Shell脚本,我在其中从文件中搜索ID和端口号并将其保存在Array中。但是,当我尝试打印它们时,没有得到预期的结果。我循环数组以打印第一个和第二个元素,然后增加两个以打印第三个和第四个元素。我还想像每个ID Port一样在单独的行中打印它们,如下所示:

ID Port
ID Port

我的代码是:

myarr=($(less radius-req | grep C4-3A-BE-18-C1-2D -B75 | grep '2018-11\|Port' | grep -v User | grep Source -B1 | awk -F "Port:|id=" '{print $2}' )); for ((i=0;i<"${#myarr[@]}";i+=2)) ; do echo $i; printf "%s\n"  "${myarr[$i]}"  "${myarr[$i+1]}"  ; done;

即使我试图回显整个数组,我也只会看到最后一个元素,而我可以打印每个单独的元素而不会出现问题。

$ myarr=($(less radius-req | grep C4-3A-BE-18-C1-2D -B75 | grep '2018-11\|Port' | grep -v User | grep Source -B1 | awk -F "Port:|id=" '{print $2}' )); echo ${myarr[@]}
 45210


$ myarr=($(less radius-req | grep C4-3A-BE-18-C1-2D -B75 | grep '2018-11\|Port' | grep -v User | grep Source -B1 | awk -F "Port:|id=" '{print $2}' )); echo ${myarr[0]}
19


$ myarr=($(less radius-req | grep C4-3A-BE-18-C1-2D -B75 | grep '2018-11\|Port' | grep -v User | grep Source -B1 | awk -F "Port:|id=" '{print $2}' )); echo ${myarr[1]}
45210


$ myarr=($(less radius-req | grep C4-3A-BE-18-C1-2D -B75 | grep '2018-11\|Port' | grep -v User | grep Source -B1 | awk -F "Port:|id=" '{print $2}' )); echo ${myarr[2]}
20


$ myarr=($(less radius-req | grep C4-3A-BE-18-C1-2D -B75 | grep '2018-11\|Port' | grep -v User | grep Source -B1 | awk -F "Port:|id=" '{print $2}' )); echo ${myarr[3]}
45210

1 个答案:

答案 0 :(得分:1)

从您提供的输出中,我怀疑问题是由于radius-req文件中的回车符引起的。我的猜测是该文件来自Windows(或可能是网络下载),该文件使用回车符+换行符作为换行符。 Unix仅使用换行符(也称为换行符)作为终止符,而Unix程序会将回车符视为该行内容的一部分。最终结果:您将诸如“ 19<CR>”和“ 45210<CR>”之类的内容作为数组值,并且在打印它们时,它们会相互叠加打印。

如果我对这个问题是正确的,则很容易解决。只需用less radius-req替换tr -d '\r' <radius-req(无论如何都不要使用,请参见William Pursell的注释)。 tr命令进行字符替换,-d意味着仅删除而不是替换,并且\r是回车符的表示法。结果:它会删除回车符,以免它们弄乱东西。