Mengapa $ 1 dalam suatu fungsi tidak mencetak argumen pertama skrip?


13

Mengapa tidak echo $1mencetak $1dalam 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?

6
karena Anda lupa $ 1 saat menelepon print_something. Coba sertakan teks dalam pertanyaan dan bukan dalam judul.
Rui F Ribeiro

Terima kasih. Apa yang harus menjadi argumen gema jika saya harus memasukkan dalam skrip perintah: print_something "$ 1"; print_something "$ 2"; dan mungkin lebih?
pietro letti

13
Ketika saya melihat ini di HNQ saya pikir Anda mencetak uang dolar dan berharap untuk membaca beberapa cerita menarik tentang bagaimana printer Anda mendeteksi bahwa Anda mencetak uang palsu.
pipa

@pipe Saya pernah mengalami itu pada saya sebelumnya, untuk beberapa alasan menolak untuk mencetak apa pun tidak hanya yang dengan pencegahan anti-pencetakan.
Codingale

Jawaban:


41

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.


1
Melewati "$@"untuk print_something, karena itu saat ini ditulis, masih akan hanya mencetak pertama dari argumen sekalipun.
Kusalananda

13
Tapi intinya adalah untuk menunjukkan bagaimana menyampaikan semua argumen, saya kira. Fakta bahwa fungsinya, sebagaimana adanya, hanya menggunakan argumennya yang pertama agak tidak relevan.
aneh

Yah, hanya berpikir tidak ada gunanya menyampaikan semua argumen jika hanya yang pertama digunakan.
Kusalananda

14
@allo No. "$*"akan berupa string tunggal (digabung dengan karakter pertama $IFS) sementara "$@"akan menjadi daftar elemen yang dikutip secara individual.
Kusalananda

5
@ Kusalananda maksud memberitahu seseorang yang ingin meneruskan parameter baris perintah ke fungsi yang akan digunakan "$@", 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.
Monty Harder

10

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 echotidak dapat digunakan untuk data arbitrer).


Anda perlu menjadi lebih jelas apa yang Anda bicarakan. Penelepon $1umumnya berbeda dari fungsi $1, meskipun mereka BISA menjadi sama jika digunakan seperti yang diusulkan di atas. Jika saya mengerti Anda, echodapat tetap sama ( echo $1) ketika fungsi dipanggil dengan parameter tunggal ( print_something $2mengambil pemanggil $ 1 dan "membuatnya" $1di dalam fungsi)
RudiC

6
Menggunakan echo $1tidak masuk akal kecuali Anda ingin $1diperlakukan sebagai daftar pola file dibatasi $ IFS untuk diperluas. echo "$1"akan lebih masuk akal, meskipun tidak akan menampilkan konten $1untuk nilai-nilai $1seperti -nene, -EE...
Stéphane Chazelas
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.