使用换行符创建数组时出现问题

使用换行符创建数组时出现问题

我正在构建一个函数来查找文件系统上的大型目录,并且包含该路径的每个数组元素中/n的该目录都被切断。/native/proc...我相信这与我使用“\n”作为我的 IFS 有关,但我不知道还能怎么做,因为如果没有它,它会将每一列分解成它自己的元素,这不是我想要的。我需要的是每个整行都在它自己的数组元素中,该命令如何自行打印:

[root@JBLGSMM001 ~]# du -k / 2> /dev/null | sort -n | tail -n 10
255452  /usr/share
332644  /native/proc/82974
342119  /native/proc/70315
344519  /native/proc/70310
388510  /native/usr
683983  /usr
1226993 /native/proc/45026
9597039 /native/proc
10035430        /native
10846908        /

到目前为止的功能

where.isdisk () {

    bigstuff=$(du -k / 2> /dev/null | sort -n | tail -n 10)
    OLDIFS=$IFS
    IFS="\n"
    bigstuff=($bigstuff)
    IFS=$OLDIFS

}

bigstuff变量按照我想要的方式设置,如下所示:

255452 /usr/share 332644 /native/proc/82974 342119 /native/proc/70315 344519 /native/proc/70310 388510 /native/usr 683983 /usr 1226989 /native/proc/45026 9772351 /native/proc 10210742 /native 11022217 /

然后,当我创建数组时,它会修剪“/n”:

[root@JBLGSMM001 ~]# OLDIFS=$IFS
[root@JBLGSMM001 ~]# IFS="\n"
[root@JBLGSMM001 ~]# bigstuff=($bigstuff)
[root@JBLGSMM001 ~]# IFS=$OLDIFS
[root@JBLGSMM001 ~]# echo ${bigstuff[@]}
255452 /usr/share 332644 / ative/proc/82974 342119 / ative/proc/70315 344519 / ative/proc/70310 388510 / ative/usr 683983 /usr 1226989 / ative/proc/45026 9772351 / ative/proc 10210742 / ative 11022217 /

编辑

它还将“/”转移到前一个元素:

[root@JBLGSMM001 ~]# echo ${bigstuff[0]}
255452 /usr/share 332644 /
[root@JBLGSMM001 ~]# echo ${bigstuff[1]}
ative/proc/82974 342119 /
[root@JBLGSMM001 ~]# echo ${bigstuff[2]}
ative/proc/70315 344519 /
[root@JBLGSMM001 ~]# echo ${bigstuff[3]}
ative/proc/70310 388510 /

编辑2

我尝试过替换\n\012,但它仍然会产生不需要的结果:

[root@JBLGSMM001 ~]# bigstuff=$(du -k / 2> /dev/null | sort -n | tail -n 10)
[root@JBLGSMM001 ~]# OLDIFS=$IFS
[root@JBLGSMM001 ~]# IFS="\012"
[root@JBLGSMM001 ~]# bigstuff=($bigstuff)
[root@JBLGSMM001 ~]# IFS=$OLDIFS
[root@JBLGSMM001 ~]# echo ${bigstuff[@]}
5545 /usr/share 33 644 /native/proc/8 974 34 9 /native/proc/7 3 5 3445 9 /native/proc/7 3 3885 /native/usr 683983 /usr 6989 /native/proc/45 6 977 387 /native/proc 778 /native 55 /
[root@JBLGSMM001 ~]# echo ${bigstuff[0]}

[root@JBLGSMM001 ~]# echo ${bigstuff[1]}
5545
[root@JBLGSMM001 ~]# echo ${bigstuff[2]}
/usr/share 33
[root@JBLGSMM001 ~]# echo ${bigstuff[3]}
644 /native/proc/8

有人知道怎么修这个东西吗?谢谢!

答案1

shell 不会将\nin解释IFS为换行符,而是解释为字符n(已转义,此处不执行任何操作)。请注意,/前面的n没有被删除。

要设置IFS换行符,请使用

IFS='
'

bash在理解“C 字符串”(作为其中之一)的 shell 中,您还可以使用

IFS=$'\n'

相关内容