#!/bin/ksh93 function test_int_limit { typeset i=2147483646 echo -e "INT_MAX-1 = "$i let i++ echo -e "INT_MAX = "$i let i++ echo -e "INT_MAX+1 = "$i echo i=4294967294 echo -e "ULONG_MAX-1 = "$i let i++ echo -e "ULONG_MAX = "$i let i++ echo -e "ULONG_MAX+1 = "$i echo i=999999999999999998 echo "i = "$i let i++ echo "i+1 = "$i let i++ echo "i+2 = "$i echo i=9223372036854775806 echo -e "LLONG_MAX-1 = "$i let i++ echo -e "LLONG_MAX = "$i let i++ echo -e "LLONG_MAX+1 = "$i echo } test_int_limitksh について、何点か補足メモ、、、
(1) 関数定義する場合、function キーワードを使用して、関数名の後ろに () はつけません。
つけると構文エラーになります。
(2) ローカル変数を使うには、typeset を指定します。
bash にも typeset がありますが、あちらは、Obsolute (廃止) とされています。
(3) 関数定義は、(1) 以外にも旧来の 関数名() { ... } という記載方法もある。
しかし、その場合に typeset によるローカル変数指定が機能しません。
なので、ksh の場合は (1) の書き方を使いましょう。
テストスクリプトを実行した結果が、下記です。
# uname -a Linux my41 2.6.18-274.12.1.el5 #1 SMP Tue Nov 29 13:37:46 EST 2011 x86_64 x86_64 x86_64 GNU/Linux # ksh93 --version version sh (AT&T Research) 93t+ 2010-02-02 # ./test_int_limit.ksh93 INT_MAX-1 = 2147483646 INT_MAX = 2147483647 INT_MAX+1 = 2147483648 ULONG_MAX-1 = 4294967294 ULONG_MAX = 4294967295 ULONG_MAX+1 = 4294967296 i = 999999999999999998 i+1 = 999999999999999999 i+2 = 1e+18 LLONG_MAX-1 = 9223372036854775806 LLONG_MAX = 9.22337203685477581e+18 LLONG_MAX+1 = 9.22337203685477581e+18このように、18桁までは整数、19桁以上は浮動小数点数として扱ってくれるようです。
そうです。ksh は浮動小数点数を扱えます。一方、bash では浮動小数点数を扱えません。
ごく稀に、bash でも浮動小数点数を使いたい場合があり、やむなく gawk を呼び出したりしますが、ksh ならそのようなことをしなくても済むようです。
なお、ksh の typeset には、-i オプション (整数型指定) がありますが、これを指定すると内部的に int 扱いになるようで、INT_MAX までしか格納できなくなります。
bash と tcsh の扱える整数の上限については、次の記事参照。
bash で扱える整数の上限
tcsh で扱える整数の上限
初めまして。
返信削除シェルについて勉強させていただきます。