Shellcheck.net wikiで役立つ情報を見つけました。引用します。
バッシュ:
for ((init; test; next)); do foo; done
POSIX:
: "$((init))"
while [ "$((test))" -ne 0 ]; do foo; : "$((next))"; done
ただし、i++POSIX ではないため、たとえばi += 1またはに変換する必要があることに注意してくださいi = i + 1。
したがって、上記の質問のスクリプトは、次のようなルールを使用してPOSIXごとに書き直すことができます。
#!/bin/sh
: "$((i=1))"
while [ "$((i != 0))" -ne 0 ]
do
echo "$i"
: "$((i = i + 1))"
done
ここでも、次のようにすると読みやすくなります。
#!/bin/sh
i=1
while [ "$i" -ne 10 ]
do
echo "$i"
i=$((i + 1))
done
のようにinit、定数値を割り当てているため、算術式を評価する必要はありません。i != 10中には、test簡単に翻訳することができます[表現、およびためnext、シェル変数の代入を使用して算術式内の変数の代入とは反対に、私たちは取り除くことができます:し、引用の必要性。
横にi++- > i = i + 1、あなたがしなければならないかもしれないというPOSIXではないのksh / bashの固有の構築物の複数の翻訳があります。
i=1, j=2。算術演算子はないが、実際に POSIX(とは、ksh93といくつかのロケールの小数点セパレータと競合)。あなたは次のように別のオペレータでそれを置き換えることができますのようにしかし使用して、より多くの読みやすくなります。,+: "$(((i=1) + (j=2)))"i=1 j=2
a[0]=1:POSIXシェルには配列がありません
i = 2**20:POSIXシェル構文にパワー演算子がありません。<<はサポートされていますが、2の累乗の場合、1つを使用できますi = 1 << 20。他の権限については、次の手段をとることができますbc。i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3:POSIXではありません。POSIXツールチェストで最も近いのはi=$(awk 'BEGIN{srand(); print int(rand() * 3)}')です。