for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Hai, saya perlu ungkapan yang disederhanakan untuk baris ketiga, mungkin yang tidak menggunakan substitusi perintah.
for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Hai, saya perlu ungkapan yang disederhanakan untuk baris ketiga, mungkin yang tidak menggunakan substitusi perintah.
bash
dan tidakC
, jadi hapus semua;
- kecuali Anda menulisnya dalam satu baris.declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
$(( ... ))
apakah ekspansi aritmatika bukan perintah substitusi.Jawaban:
Menggunakan ekspansi aritmatika:
Menggunakan
expr
utilitas kuno :Menggunakan
bc -l
(-l
sebenarnya tidak diperlukan dalam kasus ini karena tidak ada fungsi matematika yang digunakan):Menggunakan
bc -l
sebagai proses bersama (ini bertindak seperti semacam layanan perhitungan di latar belakang¹):Yang terakhir terlihat (bisa dibilang) lebih bersih di
ksh93
:¹ Ini pernah memecahkan masalah bagi saya ketika saya harus memproses sejumlah besar input dalam satu lingkaran. Pemrosesan membutuhkan beberapa perhitungan floating point, tetapi pemijahan
bc
beberapa kali dalam loop terbukti sangat lambat. Ya, saya bisa menyelesaikannya dengan banyak cara lain, tetapi saya bosan ...sumber
Anda dapat menyederhanakan:
untuk:
sumber
Anda dapat menggunakan
let
perintah untuk memaksa perhitungan.Perhatikan bahwa kita tidak perlu
$k
dalam struktur ini; sederhanak
akan melakukan pekerjaan itu.sumber
a=2whateverk+1
di direktori saat ini. Lebih buruk lagi, jika ada file yang dipanggila=2+b[$(reboot)]k+1
, yang memanggilreboot
perintah. Yang terbaik adalah menggunakan di((...))
sini (((a = 2 * k + 1))
), atau sintaks POSIX:a=$((2 * k + 1))
let a="2*k+1"
untuk menyelesaikannya.Perluasan aritmatika yang mungkin Anda butuhkan adalah ini:
Bahkan, Anda tidak perlu menggunakan variabel:
Atau variabel penghitungan dapat dipindahkan ke
for ((…))
loop:untuk ((...)) loop
Dan, dalam hal itu, ekspansi aritmatika juga dapat dipindahkan ke dalam loop for:
Atau, untuk mendapatkan semua nilai dalam array:
Tidak ada formula
Tapi mungkin cara terpendek untuk menghindari ekspansi aritmatika adalah dengan menambahkan variabel dua kali:
Atau, lebih sederhana, cukup gunakan seq:
sumber