Saya telah menemukan informasi yang berguna di wiki Shellcheck.net , saya kutip:
Pesta:
for ((init; test; next)); do foo; done
POSIX:
: "$((init))"
while [ "$((test))" -ne 0 ]; do foo; : "$((next))"; done
meskipun waspadalah yang i++bukan POSIX jadi harus diterjemahkan, misalnya ke i += 1atau i = i + 1.
Jadi skrip di atas dalam pertanyaan dapat ditulis ulang dengan POSIX menggunakan aturan-aturan seperti ini:
#!/bin/sh
: "$((i=1))"
while [ "$((i != 0))" -ne 0 ]
do
echo "$i"
: "$((i = i + 1))"
done
Meskipun di sini, Anda dapat membuatnya lebih terbaca dengan:
#!/bin/sh
i=1
while [ "$i" -ne 10 ]
do
echo "$i"
i=$((i + 1))
done
seperti pada init, kami memberikan nilai konstan, jadi kami tidak perlu mengevaluasi ekspresi aritmatika. The i != 10di testdapat dengan mudah diterjemahkan ke [ekspresi, dan untuk next, menggunakan shell tugas variabel sebagai lawan tugas variabel dalam sebuah ekspresi aritmatika, mari kita menyingkirkan :dan kebutuhan untuk mengutip.
Di samping i++-> i = i + 1, ada lebih banyak terjemahan dari konstruksi spesifik ksh / bash yang bukan POSIX yang mungkin harus Anda lakukan:
i=1, j=2. The ,Operator aritmatika tidak benar-benar POSIX (dan konflik dengan pemisah desimal di beberapa lokal dengan ksh93). Anda bisa menggantinya dengan operator lain seperti +di : "$(((i=1) + (j=2)))"tetapi menggunakan i=1 j=2akan jauh lebih terbaca.
a[0]=1: tidak ada array di kulit POSIX
i = 2**20: tidak ada operator daya dalam sintaks POSIX shell. <<didukung meskipun begitu untuk kekuatan dua, satu dapat digunakan i = 1 << 20. Untuk kekuatan lain, seseorang dapat menggunakan bc:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3: bukan POSIX. Yang paling dekat di toolchest POSIX adalah i=$(awk 'BEGIN{srand(); print int(rand() * 3)}').