Saya memiliki skrip bash berikut:
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
for
Loop pertama ( tanpa variabel upperlim
dalam kontrol loop) berfungsi dengan baik, tetapi for
loop kedua ( dengan variabel upperlim
dalam kontrol loop) tidak. Apakah ada cara saya bisa memodifikasi for
loop kedua sehingga berfungsi? Terima kasih atas waktunya.
bash
shell
shell-script
for
Andrew
sumber
sumber
for i in {0..$((upperlim))}; do echo $i; done
tidak berfungsiJawaban:
Alasan untuk ini adalah urutan di mana hal-hal terjadi di bash. Ekspansi brace terjadi sebelum variabel diperluas. Untuk mencapai tujuan Anda, Anda perlu menggunakan C-style untuk loop:
sumber
zsh
juga (tetapi tidak untukcsh
,tcsh
).Untuk menyelesaikan ini dalam gaya Anda menggunakan apa-apa selain built-in Anda harus menggunakan eval:
Tetapi dengan
seq
:Secara pribadi saya menemukan penggunaan
seq
menjadi lebih mudah dibaca.sumber
seq
adalah perintah eksternal dan tidak tersedia di mana-mana bash.seq
", mengakui bahwa itu bukan bawaan.read
adalah builtin misalnya, tetapi tidak ada alasan untukeval
itu.Cara POSIX
Jika Anda peduli tentang portabilitas, gunakan contoh dari standar POSIX :
Keluaran:
Hal-hal yang bukan POSIX:
(( ))
tanpa dolar, meskipun itu adalah ekstensi umum seperti yang disebutkan oleh POSIX sendiri .[[
.[
sudah cukup di sini. Lihat juga: https://stackoverflow.com/questions/13542832/bash-if-difference-between-square-brackets-and-double-square-bracketsfor ((;;))
seq
{start..end}
, dan itu tidak bisa bekerja dengan variabel seperti yang disebutkan oleh manual Bash .let i=i+1
: POSIX 7 2. Bahasa Perintah Shell tidak mengandung katalet
, dan gagal padabash --posix
4.3.42dolar
i=$i+1
mungkin diperlukan, tapi saya tidak yakin. POSIX 7 2.6.4 Ekspansi Aritmatika mengatakan:tetapi membacanya secara harfiah yang tidak menyiratkan bahwa
$((x+1))
memperluas karenax+1
bukan variabel.sumber
Pendekatan Anda tidak akan berfungsi karena ekspansi bash brace terjadi sebelum ekspansi parameter. Anda perlu memperluas variabel sebelum.
Anda dapat bekerja dengan eval :
Dengan Loop Sementara :
Anda juga dapat melakukannya dengan perintah seq :
Jika Anda ingin menjalankannya,
for i in {0..$upperlim}
Anda harus menggunakan kornshell. misalnya:sumber