
這個腳本運行良好,我將其修改為增加 5。
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done
答案1
在 GNU 和其他一些系統上,對於這個特定問題,只需使用seq
:
seq -s, 0 5 55
這給出了從 0 到 55(含)的序列,並用逗號分隔。
有一些純 bash 選項,如果您的問題比範例建議的更複雜一些,它們可能會很有用。最標準的方法是使用明確測試來確定是否處於最後一次迭代:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j"
[ $i -lt 12 ] && echo -n ,
done
這裡我們每次只列印出$j
,並在列印逗號之前測試是否$i
小於 12 (即我們不是在最後一次迭代)。
另一種方法是將整個輸出建構成單一字串:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
ACCUM="$ACCUM$j,"
done
echo "${ACCUM%,}"
在這裡,我們保留了ACCUM
您已經列印出來的相同內容,但我們不在循環本身中輸出任何內容。您可以用${ACCUM%,}
: that刪除末尾的逗號擴展到的值ACCUM
與末尾匹配的任何內容都,
被截斷。
不過,如果該seq
選項適合您的用例,我會選擇它。
答案2
在 bash 中你很少真正需要循環:
echo {0..55..5} | sed 's/ /,/g'
答案3
這裡有一個潛在的“純 bash”解決方案,使用數組擴展形式的IFS
變量,而不是到處添加逗號然後刪除最後一個逗號[*]
a=( {0..55..5} ); (IFS=, ; printf '%s\n' "${a[*]}")
0,5,10,15,20,25,30,35,40,45,50,55
看BashGuide/數組有關詳細資訊 - 包括使用(...)
子 shell 來保留父 shellIFS
值的解釋。
如果您不想使用陣列方法,那麼您可以sed
透過使用 shell 的內建字串替換功能來避免使用外部命令,例如(同樣在 bash 中)
printf -v str '%s,' {0..55..5}; printf '%s\n' "${str%,}"
0,5,10,15,20,25,30,35,40,45,50,55
答案4
您收到的更複雜的解決方案更好,但為了完整起見,您始終可以刪除最後的逗號sed
:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done | sed 's/,$//'