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)}')
です。