Posix

可移植 POSIX shell 替代 GNU seq(1)?

  • April 27, 2021

我注意到seq(1)除了 GNU 系統之外,你不能真正指望在任何東西上可用。seq(1)用 POSIX(不是 bash)shell 編寫的我可以隨身攜帶的簡單重新實現是什麼?

編輯:請注意,我打算至少在各種 BSD、Solaris 和 Mac OS X 上使用它。

根據開放組POSIX awk 支持BEGIN,因此可以在以下位置完成awk

awk -v MYEND=6 'BEGIN { for(i=1;i<=MYEND;i++) print i }'

Where-v MYEND=6將代表賦值,如seq. 換句話說,這也有效:

END=6
for i in `awk -v MYEND=$END 'BEGIN { for(i=1;i<=MYEND;i++) print i }'`; do
   echo $i
done

甚至使用三個變數(開始、增量和結束):

S=2
I=2
E=12
for i in `awk -v MYS=$S -v MYI=$I -v MYE=$E 'BEGIN { for(i=MYS;i<=MYE;i+=MYI) print i }'`; do
   echo $i
done

額外的Solaris注意:在 Solaris/usr/bin/awk兼容 POSIX,您需要在 Solaris 上使用nawk或使用/usr/xpg4/bin/awk

/usr/xpg4/bin在 Solaris 上,如果您正在執行符合 POSIX 的腳本,您可能希望儘早在 PATH 中設置。

參考答案:

一種替代方法awkbc

seq() (first=$1 incr=$2 last=$3
 echo "for (i = $first; i <= $last; i+=$incr) i" | bc -l
)

一個優點是您不受 CPU 雙精度的大小/解析度的限制:

$ seq '(2^200)' '(2^100)' '(2^200+2^102)'
1606938044258990275541962092341162602522202993782792835301376
1606938044258990275541962092342430253122431223184289538506752
1606938044258990275541962092343697903722659452585786241712128
1606938044258990275541962092344965554322887681987282944917504
1606938044258990275541962092346233204923115911388779648122880

但是當數字太大時要注意換行:

$ seq '(2^500)' '(2^100)' '(2^500+2^101)'
32733906078961418700131896968275991522166420460430647894832913680961\
33796404674554883270092325904157150886684127560071009217256545885393\
053328527589376
32733906078961418700131896968275991522166420460430647894832913680961\
33796404674554883270092325904157150886684127560071010484907146113622\
454825230794752
32733906078961418700131896968275991522166420460430647894832913680961\
33796404674554883270092325904157150886684127560071011752557746341851\
856321934000128

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