Saya agak macet. Tugas saya adalah mencetak argumen ke skrip saya dalam urutan terbalik kecuali yang ketiga dan keempat.
Apa yang saya miliki adalah kode ini:
#!/bin/bash
i=$#
for arg in "$@"
do
case $i
in
3) ;;
4) ;;
*) eval echo "$i. Parameter: \$$i";;
esac
i=`expr $i - 1`
done
Karena saya benci eval (salam ke PHP), saya mencari solusi tanpa itu tetapi saya tidak dapat menemukannya.
Bagaimana saya bisa mendefinisikan posisi argumen secara dinamis?
PS: Bukan itu bukan pekerjaan rumah, saya sedang belajar shell untuk ujian jadi saya mencoba menyelesaikan ujian lama.
sumber
arg
karena mereka dipesan dengan benar dan tidak terbalik. Untuk penggunaanexpr
, saya terbatas hanya menggunakan standar.#!/bin/bash
, Anda dapat menggunakan${!i}
dan(())
. Jika Anda ingin tetap menggunakan sh standar , ini tidak tersedia, tetapi tersedia$((…))
.eval
adalah tidak satu-satunya cara portabel seperti Ryan telah menunjukkan .Saya menyimpan skrip
reverse
di jalur saya yang melakukan ini:Contoh penggunaan:
Anda juga dapat menggunakan fungsi alih-alih skrip khusus.
sumber
$#
? Bisakah itu selain bilangan bulat non-negatif?local arg=$1
Ini adalah penggunaan eval yang benar dan tidak berbahaya. Anda sepenuhnya mengontrol konten yang sedang Anda gunakan
eval
.Jika masih memberi Anda perasaan buruk, maka jika Anda tidak peduli tentang portabilitas, Anda dapat menggunakan
${!i}
sintaks Bir's indirection.sumber
${!i}
bukankah bagian dari sintaks standar?Dengan asumsi parameter posisi tidak mengandung karakter baris baru:
Uji:
Hasil tes:
sumber
Dengan
zsh
:Oa
adalah flag ekspansi parameter untuk mengurutkan elemen array setelah ekspansi dalam indeks array terbalik .Untuk mengecualikan 3 dan 4:
sumber
Dengan dasarnya semua shell:
Dan Anda tidak perlu menggunakan subkulit. Sebagai contoh:
... mencetak ...
Dan di sini adalah fungsi shell yang dapat mengatur shell
alias
untuk Anda yang akan mencetak argumen maju atau mundur:Itu tidak berusaha untuk menyimpan nilai-nilai literal untuk argumen apa pun, melainkan menempatkan string seperti ini di
args
alias
:... dan hanya menyimpan referensi ke parameter mundur dan maju. Ini akan menyimpan hingga hitungan sebagaimana diberikan sebagai argumen. Maka di atas
alias
dihasilkan seperti:printf
Perilaku dipengaruhi berdasarkan nilai kembali dari perintah sebelumnya - yang selalu:
merupakan perintah nol, dan biasanya benar.printf
akan melewatkan setengah dari argumennya setiap kali ia mencetak - yang, secara default, akan mendapatkan argumen yang dicetak dari yang paling kecil ke yang terbesar. Namun, jika Anda hanya melakukannya:... itu mencetaknya secara terbalik.
Karena alias tidak menyimpan nilai literal apa pun, nilainya tetap statis sementara arg yang sebenarnya mungkin berubah, tetapi masih akan merujuk sebanyak mungkin. Sebagai contoh:
... yang mencetak ...
Tetapi mengatur ulang alias bisa dilakukan seperti:
... dan itu mencetak ...
sumber
sumber
for ((i = $# - 1; i >= 0; i--))