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?
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?
Jawaban:
Parameter posisi mengacu pada argumen skrip di tingkat utama skrip, tetapi berfungsi argumen di badan fungsi. Begitu
print_something Something
akan benar-benar mencetak Something
.
Jika Anda ingin meneruskan argumen skrip ke suatu fungsi, Anda harus melakukannya secara eksplisit. Menggunakan
print_something "$1"
untuk melewati argumen pertama, atau
print_something "$@"
untuk melewati mereka semua, meskipun fungsi dalam contoh hanya menggunakan yang pertama.
"$@"
untuk print_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
print_something "$1"
(dan echo "$1"
, atau bahkan lebih baik printf '%s\n' "$1"
, ingatlah untuk mengutip ekspansi parameter dan itu echo
tidak dapat digunakan untuk data arbitrer).
$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
...