我有一个简单的Shell脚本,我在其中从文件中搜索ID和端口号,并将其保存在Array中。然而,当我尝试打印它们时,我并没有得到预期的结果。我循环数组以打印第一个和第二个元素,然后增加两个以打印第三个和第四个元素。我还想把它们像每个ID端口一样打印在单独的行中,比如这样:
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 "%sn" "${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
从您给出的输出中,我怀疑问题是由于radius-req文件中的回车字符造成的。我猜这个文件来自Windows(或者可能是网络下载(,它使用回车+换行作为行终止符。Unix只使用换行符(又称换行符(作为终止符,Unix程序将回车视为换行内容的一部分。最终结果:您可以得到像"19<CR>
"one_answers"45210<CR>
"这样的数组值,当您打印它们时,它会将它们打印在一起。
如果我对这个问题的看法是正确的,那么很容易解决。只需将less radius-req
(无论如何都不应该使用,请参阅William Pursell的评论(替换为tr -d 'r' <radius-req
。tr
命令执行字符替换,-d
表示只是删除而不是替换,而r
是其回车字符的表示法。结果:它会在回车有机会把事情搞砸之前删除回车。