![[[ 0*10%300 ]] AIX 6.1では機能しますが、AIX 7.1では機能しません(ksh)。](https://linux33.com/image/98262/%5B%5B%200*10%25300%20%5D%5D%20AIX%206.1%E3%81%A7%E3%81%AF%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81AIX%207.1%E3%81%A7%E3%81%AF%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%EF%BC%88ksh%EF%BC%89%E3%80%82.png)
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
答え2
kshは算術拡張とは異なる動作をするようです。この問題を解決するために、AIX 6 と AIX 7 の両方で期待どおりに機能する算術置換を明示的に使用します。
...
if [[ ( $((f_count * sleep_interval % alarm_interval)) -eq 0 ) && $f_count -gt 0 ]]
...
答え3
おそらく答えは簡単です。算術式の先頭にある変数が0(ゼロ)に拡張されると、問題が発生します。これは KSH 条件式の -eq の左オペランドです。 -eq は数値比較で、演算子は左のオペランドとして数値を期待します。
オペランドを拡張/評価するときは、演算子は3つのステップを実行する必要があります。 a)変数の拡張、b)先行ゼロの削除、c)この順序で式を評価すると、観察された問題が発生します。
以前のシェルバージョンでa)変数拡張、b)式の評価、c)先行ゼロの削除を実行した場合、問題は発生しません.