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 += 1
atau 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 != 10
di test
dapat 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=2
akan 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)}')
.