次の内容で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`