2016-09-15 4 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 

私はより多くのデータが1ページに収まるように、複数の列にそのリストを分割したいと思います。列echo "$((i++))) $m" | columnにパイプするだけで、列が1つだけ表示され、今度はすべての行が0)で始まり、次に項目がリストされます。

How to output an array's content in columns in BASHで与えられた答えは、出力の複数の列を作る限り動作します。

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

しかし、アレイは数だけ出力が最初0であるとして番号付けのために動作しないi=0; echo "$((i++))" bashの演算方法を用いて、引用されている。なぜなら

私の質問は、配列のデータを複数の列の番号付きリストに出力するにはどうすればいいですか?

あなたは prに単一の列とパイプそれを、それをプリントアウトについて、どのように
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

あなたのコードは複数の問題があります。 [ls'(http://mywiki.wooledge.org/ParsingLs)と[quote everything](/ questions/10067266/when-to-wrap-around-a-variable)を使用しないでください。とにかくあなたが実際に単に '$ HOME"/* 'のファイルを選択しているように見えます。 – tripleee

+0

あなたが正しいことを知っています。この特定の例では、ファイル名に空白やメタキャラクタが含まれていないことは確かです。 –

答えて

1

xargscolumn -t今、あなたの元のスクリプトにいくつかの変更を加えました、すべての3つのレコードの後に​​行を分割し、その後、 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

$ 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:illegal option - -'というエラーメッセージが表示されます –

+0

'ps'のパラメータに迷いがありますか?あなたは何をOSとして使っていますか? –

関連する問題