Saat menjalankan skrip shell, apakah mungkin untuk melewati parameter posisi tertentu tanpa harus memasukkan semuanya secara berurutan?


13

Misalnya, jika saya memiliki skrip ./foo yang mengambil 10 parameter, dan saya hanya ingin melewatkan parameter ke-8. Satu-satunya cara saya tahu bagaimana melakukan ini saat ini adalah:

./foo '' '' '' '' '' '' '' 'bar'

Apakah ada cara yang lebih mudah / lebih baik?


1
Inilah sebabnya mengapa program biasanya menggunakan opsi daripada parameter posisi jika Anda memiliki banyak parameter.
Barmar

Jawaban:


4

Cara lain untuk melakukan hal ini adalah dengan memberi nama parameter yang ingin Anda deklarasikan dan kemudian melakukannya:

{   cat >./foo 
    chmod +x ./foo
    eight=declared ./foo
    eight=declared_and_preferred \
        ./foo 1 2 3 4 5 6 7 8
    ./foo 1 2 3 4 5 6 7 8
    ./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT

KELUARAN

$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default

Dalam contoh di atas variabel lingkungan yang dinyatakan secara eksplisit lebih disukai daripada argumen baris perintah, tetapi argumen baris perintah digunakan ketika variabel lingkungan kosong atau tidak disetel. Ketika posisi ke-8 dan variabel lingkungan $eightkosong atau tidak disetel, nilai default some_default ditetapkan $eight. Dalam kedua kasus itu :dapat dihapus dari:-:= pernyataan atau jika kosong harus menjadi nilai yang dapat diterima.

Variabelnya $eightjuga dapat diatur seperti:

printf '$eight = %s\n' "${eight:=${8:-some_default}}"

... dan baris sebelumnya dihilangkan seluruhnya tetapi saya ingin menunjukkan bahwa mendeklarasikan variabel dengan cara itu menghasilkan nilai yang persisten, dan jadi saya melakukannya dalam dua perintah. Either way$eight diatur ke nilai akhir dari ekspansi parameter majemuk.

getopts- untuk skrip yang kuat - seringkali merupakan cara terbaik untuk menangani opsi perintah . Parameter posisi, di sisi lain, hampir selalu merupakan cara paling sederhana untuk menangani operan dengan kuat dalam skrip.

Sebagai contoh:

touch file$(seq -ws\ file 100)
./foo *

KELUARAN

$eight = file008

Di sana kami hanya melihat operan kedelapan, tetapi ada 101 di antaranya menggumpal dari direktori pengujian saya.


18

Dengan asumsi Anda dapat mengubah skrip, Anda harus mempertimbangkan menggunakan parameter opsional (opsi) alih-alih parameter yang diperlukan (argumen).

Jika Anda memiliki masing-masing dari 7 tujuh parameter pertama sebagai opsi, dan memilikinya secara default ke string kosong maka Anda bisa melakukannya:

./foo bar

Jika Anda menggunakan shell yang kompatibel dengan POSIX Anda dapat menggunakan getoptsutilitas, atau program getopt. bash- Seperti kebanyakan kerang - penawarangetopts sebagai built-in. Either way lebih mudah daripada menggulir parser baris perintah Anda sendiri.

Kecuali jika Anda menerapkan sesuatu seperti argumen non-opsi X terakhir adalah nilai untuk argumen Y terakhir dan argumen opsi XY Anda harus memberikan string opsi sebelum masing-masing dari 7 string (sekarang kosong) jika Anda ingin mengatur salah satunya. Namun ini bukan praktik umum, biasanya opsi selalu merupakan opsi dan argumen argumen, dan urutan opsi "penyisipan" gratis.


5
+1untuk getopt(s). Parameter posisi adalah waktu yang menyedihkan, dan harus dihindari.
HalosGhost
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.