Mengapa tidak echo $1
mencetak $1
dalam skrip bash yang sederhana ini?
#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something
$ ./function.sh 123 -> why doesn't it print '123' as a result?
bash
shell-script
function
pietro letti
sumber
sumber
Jawaban:
Parameter posisi mengacu pada argumen skrip di tingkat utama skrip, tetapi berfungsi argumen di badan fungsi. Begitu
akan benar-benar mencetak
Something
.Jika Anda ingin meneruskan argumen skrip ke suatu fungsi, Anda harus melakukannya secara eksplisit. Menggunakan
untuk melewati argumen pertama, atau
untuk melewati mereka semua, meskipun fungsi dalam contoh hanya menggunakan yang pertama.
sumber
"$@"
untukprint_something
, karena itu saat ini ditulis, masih akan hanya mencetak pertama dari argumen sekalipun."$*"
akan berupa string tunggal (digabung dengan karakter pertama$IFS
) sementara"$@"
akan menjadi daftar elemen yang dikutip secara individual."$@"
, bahkan jika dalam kasus ini hanya ada satu parameter seperti itu, adalah untuk mencakup semua kasus tersebut. Jika OP memutuskan untuk menambahkan parameter kedua, tidak ada yang berubah dalam pemanggilan fungsi. Dan semua orang yang membaca ini akan mempelajari cara yang benar untuk melakukannya agar tidak harus melakukannya lagi nanti.Ini karena fungsi yang dipanggil mendapatkan set parameter posisinya sendiri, independen dari set orangtua / pemanggil. Mencoba
(dan
echo "$1"
, atau bahkan lebih baikprintf '%s\n' "$1"
, ingatlah untuk mengutip ekspansi parameter dan ituecho
tidak dapat digunakan untuk data arbitrer).sumber
$1
umumnya berbeda dari fungsi$1
, meskipun mereka BISA menjadi sama jika digunakan seperti yang diusulkan di atas. Jika saya mengerti Anda,echo
dapat tetap sama (echo $1
) ketika fungsi dipanggil dengan parameter tunggal (print_something $2
mengambil pemanggil $ 1 dan "membuatnya"$1
di dalam fungsi)echo $1
tidak masuk akal kecuali Anda ingin$1
diperlakukan sebagai daftar pola file dibatasi $ IFS untuk diperluas.echo "$1"
akan lebih masuk akal, meskipun tidak akan menampilkan konten$1
untuk nilai-nilai$1
seperti-nene
,-EE
...