我有这个简单的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
答案 0 :(得分:1)
从您提供的输出中,我怀疑问题是由于radius-req文件中的回车符引起的。我的猜测是该文件来自Windows(或可能是网络下载),该文件使用回车符+换行符作为换行符。 Unix仅使用换行符(也称为换行符)作为终止符,而Unix程序会将回车符视为该行内容的一部分。最终结果:您将诸如“ 19<CR>
”和“ 45210<CR>
”之类的内容作为数组值,并且在打印它们时,它们会相互叠加打印。
如果我对这个问题是正确的,则很容易解决。只需用less radius-req
替换tr -d '\r' <radius-req
(无论如何都不要使用,请参见William Pursell的注释)。 tr
命令进行字符替换,-d
意味着仅删除而不是替换,并且\r
是回车符的表示法。结果:它会删除回车符,以免它们弄乱东西。