Posix
可移植 POSIX shell 替代 GNU seq(1)?
我注意到
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 中設置。參考答案:
一種替代方法
awk
是bc
: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