Bagaimana cara mengubah argumen baris perintah di Bash?

94

Apakah ada cara untuk mengubah argumen baris perintah dalam skrip Bash. Katakanlah misalnya, skrip Bash dipanggil dengan cara berikut:

./foo arg1 arg2  

Apakah ada cara untuk mengubah nilai arg1 di dalam skrip? Katakan, sesuatu seperti

$1="chintz"
Sriram
sumber

Jawaban:

150

Anda harus mengatur ulang semua argumen. Untuk mengubah misalnya $3:

$ set -- "${@:1:2}" "new" "${@:4}"

Pada dasarnya Anda mengatur semua argumen ke nilainya saat ini, kecuali yang ingin Anda ubah. set --juga ditentukan oleh POSIX 7 .

The "${@:1:2}"notasi diperluas untuk dua (maka 2dalam notasi) argumen posisi mulai dari diimbangi 1(yaitu $1). Ini adalah singkatan untuk "$1" "$2"dalam kasus ini, tetapi jauh lebih berguna bila Anda ingin mengganti mis "${17}".

thkala
sumber
1
jadi, untuk mengubah $ 3, saya harus mengubah $ 1 dan $ 2 juga, bukan? Dan mengubahnya menjadi apa? Apa artinya "reset"?
Sriram
Terima kasih atas triknya! Saya mengalami kesulitan menggunakan ini untuk nama file dengan spasi yang disematkan. Bagi siapa pun yang mungkin mengalami masalah itu, coba letakkan evaldi garis depan per ini .
cxw
2
Ini tidak masalah jika Anda mengetahui posisi parameter yang ingin Anda ubah. Bagaimana jika Anda sebenarnya tidak mengetahuinya dan perlu mengubahnya secara dinamis? Saya mencoba dengan $ set - "$ {: 1: $ pivot}" tetapi tidak menerima variabel di sana.
Daniele Segato
1
Bagaimana saya bisa melakukan hal yang sama dari dalam suatu fungsi? Solusi Anda tampaknya tidak berfungsi saat dipanggil dari dalam suatu fungsi.
Hashken
2
Anda tidak dapat mengubah parameter posisi skrip dari dalam fungsi - argumen fungsi itu sendiri menyembunyikannya. Namun, Anda dapat menyimpannya dalam array dan mengoperasikannya.
thkala
23

Mengoptimalkan keterbacaan dan pemeliharaan, Anda mungkin lebih baik menetapkan $1dan $2ke variabel yang lebih bermakna (saya tidak tahu, input_filename = $1dan output_filename = $2atau sesuatu) dan kemudian menimpa salah satu variabel tersebut ( input_filename = 'chintz'), membiarkan input ke skrip tidak berubah, jika itu dibutuhkan di tempat lain.

Johnsyweb
sumber
Saya menginginkan pendekatan di mana saya dapat mengubah salah satu argumen masukan itu sendiri. Saya perlu melakukan itu karena saya ingin mengembalikan nilai dari skrip. Jawaban yang disarankan oleh thkala bekerja dengan baik. Terima kasih atas tanggapannya !!!
Sriram
3
@Johnsyweb Setuju. Demi keterbacaan, metode Anda adalah metode yang lebih baik.
DSS
1
"Anda lebih baik" selalu bergantung pada kasus penggunaan, yang tidak disediakan.
Scott
2
@Scott 7 tahun lebih tua dan lebih banyak pengalaman daripada saya ketika saya menulis jawaban ini, saya cenderung setuju dengan Anda.
Johnsyweb
Contoh di mana ini tidak akan berhasil (selain menggunakan sesuatu seperti $ FIRST_PARAMETER): memiliki penggunaan dan arti parameter tergantung pada nilai sebenarnya.
Igor Stoppa