Saya mencoba untuk menulis fungsi di bash yang akan mengakses argumen baris perintah skrip, tetapi mereka diganti dengan argumen posisi ke fungsi tersebut. Apakah ada cara agar fungsi mengakses argumen baris perintah jika tidak diteruskan secara eksplisit?
# Demo function
function stuff {
echo $0 $*
}
# Echo's the name of the script, but no command line arguments
stuff
# Echo's everything I want, but trying to avoid
stuff $*
bash
command-line-arguments
argv
DonGar
sumber
sumber
$*
sangat buggy - itu akan berubah./yourScript "first argument" "second argument"
menjadi./yourscript "first" "argument" "second" "argument"
, atau berubah./yourscript '*.txt'
menjadi sesuatu seperti./yourscript one.txt two.txt
meskipun ada tanda kutip.Jawaban:
Saya membaca manual ref bash mengatakan hal ini ditangkap di BASH_ARGV, meskipun berbicara banyak tentang "tumpukan".
Simpan di f.sh
sumber
Jika Anda ingin memiliki gaya argumen C (array argumen + jumlah argumen), Anda dapat menggunakan
$@
dan$#
.$#
memberi Anda jumlah argumen.$@
memberi Anda semua argumen. Anda dapat mengubahnya menjadi array denganargs=("$@")
.Jadi contohnya:
Perhatikan bahwa di sini
${args[0]}
sebenarnya adalah argumen pertama dan bukan nama skrip Anda.sumber
args
array dari dalam fungsi, jika Anda menginisialisasi sebelumnya seperti yang dijelaskan.echo "${args[0]} ${args[1]} ${args[2]}"
, atau argumen tunduk pada perluasan nama file.Edit: silakan lihat komentar saya di pertanyaan
sumber
Komentar Ravi pada dasarnya adalah jawabannya. Fungsi mengambil argumennya sendiri. Jika Anda ingin agar sama dengan argumen baris perintah, Anda harus meneruskannya. Jika tidak, Anda jelas memanggil fungsi tanpa argumen.
Yang mengatakan, Anda bisa jika Anda suka menyimpan argumen baris perintah dalam larik global untuk digunakan dalam fungsi lain:
Anda harus mengakses argumen baris perintah melalui
commandline_args
variabel, tidak$@
,$1
,$2
, dll, tapi mereka tersedia. Saya tidak mengetahui cara untuk menetapkan langsung ke array argumen, tetapi jika seseorang mengetahuinya, tolong beri tahu saya!Juga, perhatikan cara saya menggunakan dan mengutip
$@
- ini adalah cara Anda memastikan karakter khusus (spasi) tidak kacau.sumber
sumber
Seseorang dapat melakukannya seperti ini juga
Sekarang panggil skrip Anda seperti
sumber
function print() {
adalah campuran antara dua bentuk deklarasi fungsi yang berbeda -function print {
, yang merupakan sintaks ksh lama yang didukung bash untuk kompatibilitas mundur dengan pra-POSIX (artinya, pra-1991) ksh, danprint() {
, yang berstandar POSIX. Pertimbangkan untuk menggunakan satu atau yang lain untuk kompatibilitas yang lebih luas dengan cangkang lain; lihat juga wiki.bash-hackers.org/scripting/obsoleteAnda dapat menggunakan kata kunci shift (operator?) Untuk mengulanginya. Contoh:
sumber
function print() {
adalah campuran antara dua bentuk deklarasi fungsi yang berbeda -function print {
, yang merupakan sintaks ksh lama yang didukung bash untuk kompatibilitas mundur dengan pra-POSIX (artinya, pra-1991) ksh, danprint() {
, yang berstandar POSIX. Pertimbangkan untuk menggunakan satu atau yang lain untuk kompatibilitas yang lebih luas dengan cangkang lain; lihat juga wiki.bash-hackers.org/scripting/obsoleteSolusi saya:
Buat skrip fungsi yang dipanggil lebih awal dari semua fungsi lainnya tanpa memberikan argumen apa pun, seperti ini:
Selain itu, Anda dapat memanggil init dan menggunakan ORIGOPT var sesuai kebutuhan, sebagai nilai tambah, saya selalu menetapkan var baru dan menyalin konten ORIGOPT di fungsi baru saya, dengan begitu Anda dapat memastikan bahwa tidak ada yang akan menyentuhnya atau ubahlah.
Saya menambahkan spasi dan tanda hubung untuk mempermudah penguraiannya dengan 'sed -E' juga bash tidak akan meneruskannya sebagai referensi dan membuat ORIGOPT bertambah karena fungsi dipanggil dengan lebih banyak argumen.
sumber