Saya tahu cara membuat for
loop aritmatika di bash
.
Bagaimana seseorang dapat melakukan loop yang setara dalam skrip POSIX shell?
Karena ada berbagai cara untuk mencapai tujuan yang sama, jangan ragu untuk menambahkan jawaban Anda sendiri dan menguraikan sedikit tentang cara kerjanya.
Contoh satu bash
loop seperti berikut:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
shell-script
posix
bourne-shell
LinuxSecurityFreak
sumber
sumber
Jawaban:
Saya telah menemukan informasi yang berguna di wiki Shellcheck.net , saya kutip:
Pesta:
POSIX:
meskipun waspadalah yang
i++
bukan POSIX jadi harus diterjemahkan, misalnya kei += 1
ataui = i + 1
.Jadi skrip di atas dalam pertanyaan dapat ditulis ulang dengan POSIX menggunakan aturan-aturan seperti ini:
Meskipun di sini, Anda dapat membuatnya lebih terbaca dengan:
seperti pada
init
, kami memberikan nilai konstan, jadi kami tidak perlu mengevaluasi ekspresi aritmatika. Thei != 10
ditest
dapat dengan mudah diterjemahkan ke[
ekspresi, dan untuknext
, 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 menggunakani=1 j=2
akan jauh lebih terbaca.a[0]=1
: tidak ada array di kulit POSIXi = 2**20
: tidak ada operator daya dalam sintaks POSIX shell.<<
didukung meskipun begitu untuk kekuatan dua, satu dapat digunakani = 1 << 20
. Untuk kekuatan lain, seseorang dapat menggunakanbc
:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3
: bukan POSIX. Yang paling dekat di toolchest POSIX adalahi=$(awk 'BEGIN{srand(); print int(rand() * 3)}')
.sumber
terima kasih atas pengetahuan latar belakang mendalam tentang perbedaan. Setetes pengganti yang berfungsi untuk saya saat menggunakan shellcheck.net adalah seperti di bawah ini.
PESTA
POSIX
beberapa orang mencatat bahwa seq juga merupakan pilihan menggunakan seq 1 10. Membuat loop, namun ini tergantung bahwa os memiliki seq.
sumber