2016-09-15 56 views
0

以下脚本输出项目的编号列表。如何将bash数组输出到多列编号项目

#!/bin/bash 

menu=($(ls ${HOME})) 
i=0 
for m in ${menu[@]} 
do 
    echo "$((i++))) $m" 
done 

结果:

0) item 
1) item 
2) item 
3) item 

我想使更多的数据在一个页面上符合该列表分割成多个列。仅管道到echo "$((i++))) $m" | column列仍然会导致只有一列,现在每行以0)开头,后面跟着列出的项目。

How to output an array's content in columns in BASH中给出的答案尽可能地产生多列输出。

menu=($(ls $HOME)) 
echo " ${menu[@]/%/$'\n'}" | column 

但是因为阵列是引用,使用的是bash算术方法i=0; echo "$((i++))"不进行编号作为唯一的号码输出工作是第一0

我的问题是:如何将数据中的数据输出到多列的编号列表中?

0) item  4) item  8) item 
1) item  5) item  9) item 
2) item  6) item  10) item 
3) item  7) item  11) item 
+0

你的代码有多种问题,当涉及到含有空格或shell转义字符的文件名。 [不要使用'ls'](http://mywiki.wooledge.org/ParsingLs)和[引用所有内容](/ questions/10067266/when-to-wrap-quotes-around-a-variable)。无论如何,看起来你实际上只是在“$ HOME”/ *' – tripleee

+0

中选择文件。我知道你是对的。在这个特定的例子中,虽然我确信没有任何文件名包含任何空格或元字符。 –

回答

1

添加一些改变你原来的剧本,现在xargscolumn -t将每三条记录,然后经过分割线column -t将正确地压缩它。避免使用ls来获取文件列表。

#!/bin/bash 

menu=($HOME/*) 
i=0 
for m in ${menu[@]} 
do 
    echo "$((i++))) $(basename $m)" 
done |xargs -L3 |column -t 

输出示例:

0) Desktop  1) Documents 2) Downloads 
3) Music  4) Pictures 5) Public 
6) Templates 7) XXX  8) Videos 
9) backup_XXXX 10) dna  11) scripting 
12) sessions  13) sh   14) temp 
3

你怎么样把它打印出来单列和管它pr

$ for i in {0..11}; do echo $i ; done|pr -ts" " --columns 3 
0 4 8 
1 5 9 
2 6 10 
3 7 11 
+1

确实'pr'是这个工作的正确工具+1 – anubhava

+0

我得到错误消息'PR:非法选项 - '' –

+0

那么,你有's'在'ps'的参数中有个'''?你在用什么作为操作系统? –