Bash

使用 for 循環顯示列數和列中的項目數

  • May 7, 2021

我正在編寫一個 BASH 腳本,詢問使用者列數和要放入列中的項目數。然後,該腳本將使用 for 循環將數字放入列中。

# Number of columns
cols=$1

# Number of items
num=$2

# Iterator variable
count=1

# Number of rows
rows=$(( ($num + ($cols - 1)) / $cols ))

for x in $(seq 1 1 $rows)
do
 for y in $(seq 1 1 $cols)
 do
   echo -ne "$count\t"

   (( count++ ))
 done

 echo ""
done

例如,如果我輸入包含 28 個項目的 6 列,這就是輸出的樣子

1   2   3   4   5   6
7   8   9   10  11  12
13  14  15  16  17  18
19  20  21  22  23  24
25  26  27  28

但是,這是我使用目前程式碼得到的輸出。

1   2   3   4   5   6
7   8   9   10  11  12
13  14  15  16  17  18
19  20  21  22  23  24
25  26  27  28  29  30

提前感謝大家的幫助!

您永遠不必計算所需的行數。您只需要確保在每個$cols數字後插入換行符。

使用seqawk

$ num=28
$ cols=6
$ seq "$num" | awk -v cols="$cols" '{ printf "%-4d", $1 } NR % cols == 0 { printf "\n" } END { printf "\n" }'
1   2   3   4   5   6
7   8   9   10  11  12
13  14  15  16  17  18
19  20  21  22  23  24
25  26  27  28

這會將讀取的每個數字列印seq為左對齊的十進制數字,每個數字允許四個寬度字元,沒有尾隨換行符。然後在列印完一行數字之後輸出一個換行符,並在最後輸出一個換行符。

使用rs工具:

$ num=28
$ cols=6
$ seq "$num" | rs 0 "$cols"
1   2   3   4   5   6
7   8   9   10  11  12
13  14  15  16  17  18
19  20  21  22  23  24
25  26  27  28

如果您需要使用 shell 循環執行此操作,例如bash

$ num=28
$ cols=6
$ for ((i=1; i<=num; ++i)); do printf '%-4d' "$i"; (( i%cols == 0 )) && echo; done; echo
1   2   3   4   5   6
7   8   9   10  11  12
13  14  15  16  17  18
19  20  21  22  23  24
25  26  27  28

這模仿awk了開頭的程式碼。

引用自:https://unix.stackexchange.com/questions/648428