ทำไม $ 1 ในฟังก์ชั่นไม่พิมพ์อาร์กิวเมนต์แรกของสคริปต์?


13

เหตุใดจึงไม่echo $1พิมพ์$1ในสคริปต์ทุบตีแบบง่ายนี้

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?

6
เพราะคุณลืม $ 1 เมื่อเรียกใช้ print_something โปรดลองใส่ข้อความในคำถามและไม่อยู่ในชื่อ
Rui F Ribeiro

ขอบคุณ สิ่งที่ควรเป็นอาร์กิวเมนต์ echo หากฉันต้องการแทรกคำสั่งในสคริปต์: print_something "$ 1"; print_something "$ 2"; และอาจจะมากกว่านั้น?
pietro letti

13
เมื่อฉันเห็นสิ่งนี้ใน HNQ ฉันคิดว่าคุณกำลังพิมพ์ใบเรียกเก็บเงินดอลล่าร์และหวังว่าจะได้อ่านเรื่องราวฉ่ำ ๆ เกี่ยวกับวิธีที่เครื่องพิมพ์ของคุณตรวจพบว่าคุณกำลังพิมพ์เงินปลอม
ท่อ

@pipe ฉันเคยเกิดขึ้นกับฉันมาก่อนด้วยเหตุผลบางอย่างมันปฏิเสธที่จะพิมพ์อะไรไม่ใช่เฉพาะกับการป้องกันการพิมพ์
Codingale

คำตอบ:


41

พารามิเตอร์ตำแหน่งอ้างอิงถึงข้อโต้แย้งของสคริปต์ในระดับหลักของสคริปต์ แต่ฟังก์ชั่นการขัดแย้งในฟังก์ชั่นร่างกาย ดังนั้น

print_something Something

Somethingจริงจะพิมพ์

หากคุณต้องการส่งอาร์กิวเมนต์ของสคริปต์ไปยังฟังก์ชันคุณต้องทำอย่างชัดเจน ใช้

print_something "$1"

เพื่อผ่านการโต้แย้งครั้งแรกหรือ

print_something "$@"

เพื่อส่งผ่านทั้งหมดแม้ว่าฟังก์ชันในตัวอย่างจะใช้ฟังก์ชันแรกเท่านั้น


1
การส่งผ่าน"$@"ไปprint_somethingตามที่เขียนไว้ในปัจจุบันจะยังคงพิมพ์เฉพาะอาร์กิวเมนต์แรกเท่านั้น
Kusalananda

13
แต่ประเด็นก็คือการแสดงวิธีการผ่านการโต้แย้งทั้งหมดฉันเข้าใจ ความจริงที่ว่าฟังก์ชั่นตามที่มันยืนเพียงใช้ข้อโต้แย้งแรกของมันเป็นบิตที่ไม่เกี่ยวข้อง
แปลกหน้า

แค่คิดว่ามันไม่มีประโยชน์ที่จะผ่านการโต้แย้งทั้งหมดถ้ามีเพียงการใช้อันแรกเท่านั้น
Kusalananda

14
@ เลขที่ทั้งหมด"$*"จะเป็นสตริงเดียว (รวมกับอักขระตัวแรกของ$IFS) ในขณะที่"$@"จะเป็นรายการขององค์ประกอบที่ยกมาเป็นรายบุคคล
Kusalananda

5
@KanDananda จุดบอกคนที่ต้องการส่งพารามิเตอร์บรรทัดคำสั่งไปยังฟังก์ชั่นการใช้งาน"$@"แม้ว่าในกรณีนี้จะมีเพียงพารามิเตอร์เดียวเท่านั้นคือการครอบคลุมทุกกรณี หาก OP ตัดสินใจที่จะเพิ่มพารามิเตอร์ตัวที่สองจะไม่มีอะไรเปลี่ยนแปลงในการเรียกใช้ฟังก์ชัน และทุกคนที่อ่านสิ่งนี้จะได้เรียนรู้วิธีการที่ถูกต้องเพื่อหลีกเลี่ยงไม่ต้องทำซ้ำในภายหลังเช่นกัน
Monty Harder

10

นี่เป็นเพราะฟังก์ชั่นที่เรียกว่าได้รับชุดพารามิเตอร์ตำแหน่งของตัวเองโดยไม่ขึ้นกับชุดของผู้ปกครอง / ผู้โทร ลอง

print_something "$1"

(และecho "$1"หรือดีกว่าprintf '%s\n' "$1"โปรดอย่าลืมอ้างอิงการขยายพารามิเตอร์และechoไม่สามารถใช้สำหรับข้อมูลที่กำหนดเอง)


คุณต้องชัดเจนในสิ่งที่คุณกำลังพูดถึง ผู้เรียก$1โดยทั่วไปแล้วจะแตกต่างจากฟังก์ชั่น$1แม้ว่าจะสามารถใช้งานได้เหมือนกันหากใช้ตามที่เสนอข้างต้น ถ้าฉันทำให้คุณถูกต้องechoสามารถอยู่ที่เดิม ( echo $1) เมื่อฟังก์ชั่นถูกเรียกด้วยพารามิเตอร์เดียว ( print_something $2ใช้เวลาโทร $ 1 และ "ทำให้" มัน$1อยู่ในฟังก์ชั่น)
RudiC

6
การใช้echo $1ไม่สมเหตุสมผลถ้าคุณต้องการ$1ให้เป็นรายการรูปแบบไฟล์ที่คั่นด้วย $ IFS เพื่อขยาย echo "$1"จะทำให้รู้สึกมากขึ้น แต่จะไม่ส่งออกเนื้อหาของ$1ค่าของ$1ชอบ-nene, -EE...
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.