AIX 6.1からAIX 7.1にマイグレーションするksh93スクリプトがあります。
7.1では失敗しましたが、6.1ではうまくいきます。以下は重要な部分の一部です。
integer f_count=0
. . .
. . .
. . .
if [[ ($f_count*$sleep_interval%$alarm_interval -eq 0 ) && $f_count > 0 ]]
then
「if」に達すると
行191: *10%300: 算術構文エラー
私はこれをコマンドプロンプトに入力して単純化することにしました。
AIX 7.1> integer x=1
AIX 7.1> [[ $x*10%300 -eq 0 ]]
AIX 7.1> print $?
1
AIX 7.1> integer x=0
AIX 7.1> [[ $x*10%300 -eq 0 ]]
-ksh93: *10%300: arithmetic syntax error
AIX 6.1> integer x=1
AIX 6.1> [[ $x*10%300 -eq 0 ]]
AIX 6.1> print $?
1
AIX 6.1> integer x=0
AIX 6.1> [[ $x*10%300 -eq 0 ]]
AIX 6.1> print $?
0
AIX 6.1でksh93であることを示すためにこれを行いました。
asdlkfjasd
-ksh93: asdlkfjasd: not found.
0 値を移動して最初の値でない場合は、期待どおりに動作します。
AIX 7.1> integer x=1
AIX 7.1> [[ 10*$x%300 -eq 0 ]]
AIX 7.1> print $?
1
AIX 7.1> integer x=0
AIX 7.1> [[ 10*$x%300 -eq 0 ]]
AIX 7.1> print $?
0
元の方程式の2番目と3番目の変数は決してゼロになることができないことがわかっているので、これは問題を解決します。
AIX 7.1のバグが表示されますか?
ベストアンサー1
ksh93でバグが見つかったようです。
次のコマンドを使用してこれを再現できます(ksh93u +)。
$ x= ksh -c '[[ 0*1 -eq 5 ]]'
ksh: *1: arithmetic syntax error
それは重要ではありません:
ksh -c '[[ " 0*1" -eq 5 ]]'
しかし。ksh93v-
(ベータ版)では再現できず、修正されたようです。
とにかく私は次を使用します:
if ((f_count * sleep_interval % alarm_interval == 0 && f_count > 0)); then
いくつかの注意:
- inside
[[...]]
、>
文字列比較用 (10
2 より小さく、ロケールによって-1
0 より大きくてもよい)。数値比較に使用されます-gt
(使用する方が良いですが((...))
)。 x
代わりに使用するなど、算術式内で変数を拡張しないでください$x
。$ x=-1 ksh -c '((-$x > 0))' ksh: --1 > 0: assignment requires lvalue
そして
$ x=-1 ksh -c '((-x > 0))' $
または:
$ x=1+1 ksh -c 'echo "$(($x * 2)) $((x * 2))"' 3 4