Saya mendapatkan yang berikut ini untuk bekerja:
for i in {2..10}
do
echo "output: $i"
done
Ini menghasilkan sekelompok baris output: 2
, output: 3
, seterusnya.
Namun, coba jalankan hal berikut:
max=10
for i in {2..$max}
do
echo "$i"
done
menghasilkan yang berikut:
output: {2..10}
Bagaimana saya bisa membuat kompiler menyadari bahwa ia harus memperlakukan $ max sebagai ujung array, dan bukan bagian dari string?
echo "$i
seharusnyaecho "$i"
- tidak akan memperbaiki masalah, meskipun.do
danthen
kata kunci pada baris yang sama denganfor
danif
, masing-masing. Misalnya,for i in {2..10}; do
Jawaban:
Perluasan brace, {x..y} dilakukan sebelum ekspansi lainnya, jadi Anda tidak bisa menggunakannya untuk urutan panjang variabel.
Sebaliknya, gunakan
seq 2 $max
metode sebagai pengguna mob dinyatakan .Jadi, sebagai contoh Anda akan:
sumber
seq
untuk menghitung dan menambah angka dalam for loop, karena itu disarankan agar Anda tidak menggunakanseq
. Perintah ini dibiarkan untuk kompatibilitas dengan bash lama. Perintah bawaan cukup cepat.for (( EXP1; EXP2; EXP3 )) ...
for (( ... ))
sintaksnya bukan POSIX dan itu artinya misalnya tidak akan bekerja di luar kotak pada hal-hal seperti Alpine Linux.seq
tidak.#!/bin/sh
adalah Dash di Debian / Ubuntu.Coba versi ekspresi aritmatika
for
:Ini tersedia di sebagian besar versi bash, dan harus kompatibel dengan Bourne shell (sh).
sumber
sh
, alih-alih menjadikannya tautan ke shell lain. Idealnya, shell seperti itu dipanggil karena hanyash
akan mendukung fitur-fitur tersebut dalam standar POSIX, tetapi secara default membiarkan beberapa fitur tambahan melaluinya. C-style for-loop bukan fitur POSIX, tetapi mungkin dalam mode oleh shell yang sebenarnya.sh
Langkah loop secara manual:
Jika Anda tidak harus benar-benar POSIX, Anda dapat menggunakan aritmatika untuk loop:
Atau gunakan jot (1) pada sistem BSD:
sumber
true $(( i++ ))
tidak berfungsi dalam semua kasus, jadi sebagian besar portabel mungkintrue $((i=i+1))
.Ada lebih dari satu cara untuk melakukannya.
sumber
eval
akan mengevaluasi apa pun yang Anda tetapkanmax
. Pertimbangkanmax="2}; echo ha; #"
, lalu gantiecho ha
dengan sesuatu yang lebih destruktif.Jika
seq
perintah tersedia di sistem Anda:Jika tidak, maka gunakan pria miskin
seq
denganperl
:Lihat tanda kutip itu.
sumber
Ini caranya:
Bash:
Cara Bash di atas akan bekerja untuk
ksh
danzsh
juga, ketikabash -c
diganti denganksh -c
atauzsh -c
masing masing.Catatan:
for i in {2..${max}}; do echo $i; done
berfungsi dizsh
danksh
.sumber
Kita dapat mengulangi loop seperti pemrograman C.
sumber
Ini berfungsi pada Mac OS X.
Ini termasuk contoh tanggal BSD, cara menambah dan mengurangi tanggal juga:
sumber
Yah, karena saya tidak
seq
menginstal perintah pada sistem saya (Mac OS X v10.6.1 (Snow Leopard)), sayawhile
malah menggunakan loop:* Mengangkat bahu * Apapun yang berhasil.
sumber
Semua ini dilakukan
{1..8}
dan semuanya POSIX. Mereka juga tidak akan rusak jika Anda menempatkan kondisionalcontinue
dalam loop. Cara kanonik:Cara lain:
dan lainnya:
sumber
Menggunakan:
Anda memerlukan panggilan 'eval' eksplisit untuk mengevaluasi kembali {} setelah penggantian variabel.
sumber