Saya perlu menulis skrip yang memulai program saya dengan argumen yang berbeda, tetapi saya baru di Bash. Saya memulai program saya dengan:
./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]
.
Inilah pseudocode untuk apa yang ingin saya lakukan:
for each filename in /Data do
for int i = 0, i = 3, i++
./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt
end for
end for
Jadi saya benar-benar bingung bagaimana cara membuat argumen kedua dari argumen pertama, jadi sepertinya dataABCD_Log1.txt dan mulai program saya.
basename -s
ekstensi tidak standar - saya akan mengedit jawaban saya untuk menggunakan sintaks standar.shopt -s nullglob
sebelum loop (danshopt -u nullglob
setelah untuk menghindari masalah nanti), atau tambahkanif [[ ! -e "$filename ]]; then continue; fi
pada awal loop, sehingga akan melewati file yang tidak ada.Maaf untuk membatalkan utas, tetapi setiap kali Anda mengulangi file dengan globbing, ada baiknya untuk menghindari kasus sudut di mana glob tidak cocok (yang membuat variabel loop meluas ke string pola glob (tidak cocok) dengan string itu sendiri).
Sebagai contoh:
Referensi: Bash Pitfalls
sumber
shopt nullglob
! (ataushopt failglob
dapat digunakan juga, tergantung pada perilaku yang Anda inginkan).dir.txt
The
name=${file##*/}
substitusi ( ekspansi parameter shell ) menghapus terkemuka path hingga terakhir/
.The
base=${name%.txt}
substitusi menghilangkan trailing.txt
. Agak sulit jika ekstensi dapat bervariasi.sumber
base=${name%.txt}
, bukanbase=${base%.txt}
.Anda dapat menggunakan temukan opsi keluaran yang dipisahkan nol dengan membaca untuk beralih ke struktur direktori dengan aman.
Jadi untuk kasusmu
selain itu
akan menjalankan loop sementara dalam lingkup skrip (proses) saat ini dan memungkinkan keluaran find digunakan dalam pengaturan variabel jika diperlukan
sumber
$'\0'
adalah cara menulis yang aneh''
. Kau hilangIFS=
dan-r
beralih keread
: pernyataan membaca Anda harus:IFS= read -rd '' file
.$'\0'
dan menyebar beberapa titik tumpukan di sekitar. Akan mengedit yang Anda tunjukkan. Apa dampak buruk dari tidakIFS=
mencobaecho -e "ok \nok\0" | while read -d '' line; do echo -e "$line"; done
tampaknya tidak ada. Juga -r saya lihat sering default, tetapi tidak dapat menemukan contoh untuk apa yang mencegahnya terjadi.IFS=
diperlukan jika nama file berakhir dengan spasi: coba adalah dengantouch 'Prospero '
(perhatikan spasi tambahan). Anda juga perlu-r
beralih jika nama file memiliki garis miring terbalik: coba dengantouch 'Prospero\n'
.Sepertinya Anda mencoba menjalankan file windows (.exe) Tentunya Anda harus menggunakan PowerShell. Pokoknya pada bash shell Linux cukup satu-liner akan cukup.
Atau dalam sebuah bash
sumber