((x++)) を root として実行中にエラーが発生しました。

((x++)) を root として実行中にエラーが発生しました。

次の内容でbashスクリプトtemp.shを作成します。

age=0;
((age++));

通常のユーザーとして実行するとうまくいきます。

しかし、rootとして実行するとエラーが発生します。

./temp.sh: 4: ./temp.sh: age++: 見つかりません

なぜそんなことですか?

答え1

hashbangなしで/bin/sh使用される可能性が高いです。一部のPOSIXシェルは++and--演算子と算術評価をサポートしています((...))が、これは必須ではありません。

あなたの例にhashbangが含まれていないので、あなたはhashbangを使用しないと仮定しているので、あなたのスクリプトは問題の演算子をサポートしていないPOSIXシェルで実行することができます。これらのシェルは、2つのネストされたサブシェル内で実行されるコマンド((age++))として解釈されます。age++

「一般」ユーザーとして実行すると、bashや演算子、およびサポートされている他のシェルによって解釈される可能性があります((...))

関連:Shebangなしでスクリプトを実行するシェルインタプリタとは何ですか?

この問題を解決するには、スクリプトに hashbang を追加するだけです。

#!/bin/bash
age=0
((age++))

;注:行を終了するためにbash / shellで使用する必要はありません。


スクリプトをすべてのPOSIXシェルに移植するには、次の構文を使用できます。

age=$((age + 1))
age=$((age += 1))

答え2

別の古い回答(またはマルチプラットフォーム互換性に優れています)は次のとおりです。

 age=`expr $age + 1`

関連情報