Di bawah ini adalah semacam pseudo-code untuk apa yang ingin saya capai:
#!/bin/bash
# I already have the variable below figured out (positive integer):
numlines=$([returns number of lines containing specific characters in a file])
# This is basically what I want to do with it:
for i in {1..$numlines}; do
# the part below is already figured out as well:
do some other stuff
done
Saya bisa menjalankannya dengan baik dari baris perintah dengan memasukkan angka aktual dalam urutan `{1..n} '. Saya hanya perlu tahu apakah mungkin untuk memasukkan variabel di sini dan bagaimana cara melakukannya.
- Saya telah mencoba
export
ing - Saya telah mencoba menempatkan variabel itu sendiri dalam kurung kurawal di dalam urutan:
{1..${numlines}}
- Saya telah mencoba memasukkannya ke dalam tanda kutip ganda berharap itu akan berkembang:
{1.."$numlines"}
- Saya telah mencoba melarikan diri dari
$
:{1..\$numlines}
Apakah saya perlu menggunakan set -[something]
perintah agar variabel ini bisa diperluas? Saya bahkan telah mencoba beberapa bentuk penggunaan eval
... semuanya sia-sia.
Saya hanya perlu tahu apakah ada sesuatu yang sederhana atau tidak jelas yang saya lewatkan atau apakah ini bahkan mungkin sebelum saya buang waktu lagi.
Saya bisa menggabungkan cara yang benar-benar sangat hack untuk membuatnya berfungsi sesuai kebutuhan, tetapi saya ingin menghindari itu jika memungkinkan dan belajar cara yang benar untuk melakukannya.
sumber
Jawaban:
Sayangnya, tidak ada cara untuk menggunakan variabel dalam ekspansi itu (AFAIK), karena ekspansi variabel terjadi setelah ekspansi penjepit.
Untungnya, ada alat yang melakukan pekerjaan yang sama.
seq
berasal dari GNU coreutils; tidak tahu bagaimana melakukannya di POSIX.sumber
seq
bagus untuk sistem GNU dan, jika saya ingat dengan benar, OSX terbaru. Pada sistem BSD lainnya, seseorang dapat menggunakan jot sebagai gantinya.seq
bekerja dengan sempurna. Terima kasih banyak atas jawaban yang cepat.{16..1}
?$(seq $numlines 1)
tidak bekerja. Saya kira saya selalu bisaman seq
, tetapi hanya ingin tahu apakah ada yang tahu dari kepala mereka.for i in $(seq $numlines -1 1)
seq ${numlines} -1 0
Tentu. Jika Anda menginginkan for for yang menambah variabel integer, gunakan bentuk
for
loop yang menambah variabel integer (atau lebih umum melakukan aritmatika pada variabel loop).Konstruk ini berfungsi di bash (dan ksh93 dan zsh), tetapi tidak di sh polos. Dalam sh polos, gunakan loop sementara dan
[ … ]
konstruksi test ( ).sumber
Jika Anda harus menghindari
seq
, yang seperti ditunjukkan Tom Hunt tampaknya menjadi solusi yang biasa untuk ini, makaeval
pasti bisa melakukannya (meskipun, saya tidak akan mendorongnya):Anda dapat tetap POSIX dengan menghindari ekspansi {}, dan cukup melakukan matematika dan perbandingan integer pada
$numlines
:Di luar POSIX,
bash
danksh
danzsh
juga memilikifor
loop gaya-C :sumber
seq
bekerja dengan baik untuk skenario saya dan tampaknya menjadi solusi paling sederhana, baik untuk mengetahui bahwa ada alternatif lain (bahkan POSIX). Terima kasih untuk ini.eval
; jika Anda memiliki ekspansi brace, Anda memiliki loop gaya-C.eval
contoh Anda adalah yang paling sederhana dan akan menyelamatkan saya dari keharusan mencari cara alternatif untuk menggunakannyaseq
. Thewhile
Loop adalah besar sedikit bagi saya. Saya suka menjaga hal-hal singkat dan manis, dan saya tidak pernah bisa mendapatkanfor
loop gaya-C untuk bekerja dengan memberikani
nilai 0 atau 1. Tidak pernah kembali dengan benar dan selalu sedikit tidak aktif. Saya yakin itu bisa di-tweak untuk bekerja dengan benar, tetapi ini jelas merupakan solusi yang membantu, toh.eval
Pendekatan ini bermasalah jika ada sesuatu yang non-sepele dalam tubuh loop. Saya membayangkan itu tidak akan terlalu mudah dibaca jika Anda perlu membuat dua loop seperti itu.