`$ คืออะไร ' มันเป็นตัวแปรหรือไม่?


23

คำถามนี้ค่อนข้างตรงไปตรงมา $?ฉันจะได้รับรหัสทางออกของคำสั่งก่อนหน้าโดยใช้ แต่มันคืออะไรกันแน่?

ผมไม่คิดว่ามันเป็นตัวแปรเพราะคุณไม่สามารถมีตัวอักษรพิเศษใด ๆ _ในชื่อของตัวแปรอื่นที่ไม่ใช่

foo?foo=10

จะทำให้เกิดข้อผิดพลาด: foo?foo=10: command not found

ดังนั้นถ้ามันไม่ใช่ตัวแปรมันคืออะไร? มีคนอื่นชอบไหม?


คำตอบ:


23

มันคืออะไร?

$? เป็นตัวแปรบิวด์อินที่เก็บสถานะการออกของคำสั่งฟังก์ชันหรือสคริปต์เอง

$?อ่านสถานะการออกของคำสั่งสุดท้ายที่ดำเนินการ หลังจากฟังก์ชั่นกลับมา$?ให้สถานะทางออกของคำสั่งสุดท้ายที่ดำเนินการในฟังก์ชั่น นี่คือวิธีที่ Bash มอบฟังก์ชั่น "คืนค่า" มันจะส่งกลับ0เมื่อสำเร็จหรือจำนวนเต็มในช่วง1 - 255ที่ผิดพลาด

มีคนอื่นชอบไหม?

ใช่มีตัวแปรในตัวหลายอย่างใน bash คุณสามารถดูรายการที่นี่ อ้างอิง: http://www.tldp.org/LDP/abs/html/exit-status.html


1
ดังนั้นมันจึงมีเฉพาะใน bash shell เท่านั้น?
daltonfury42

4
@ daltonfury42 ไม่มีเปลือกใด ๆ ที่พยายามที่จะมีความเข้ากันบางอย่างกับบอร์นเปลือกจะสนับสนุน (รวมทั้งdash, ksh, zshหมู่คนอื่น ๆ )
muru

2
csh และปลาใช้$statusเพื่อจุดประสงค์เดียวกัน
เกล็นแจ็

22

$?เป็นตัวแปร แต่เป็นอักขระพิเศษนั่นคือสาเหตุที่อนุญาตให้ใช้อักขระพิเศษ ($?)ขยายเป็นสถานะออกของไปป์ไลน์เบื้องหน้าที่ดำเนินการล่าสุด

มันไม่ได้เป็นเพียงตัวเดียวที่เชลล์ใช้กับพารามิเตอร์หลายตัวเป็นพิเศษ พารามิเตอร์เหล่านี้สามารถอ้างอิงได้เท่านั้น ไม่อนุญาตให้มอบหมายงานให้:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

แหล่งที่มา:


2
"$*"ไม่ได้เป็นเพียงพารามิเตอร์ตำแหน่งทั้งหมดเป็นคำเดียว แต่พารามิเตอร์ตำแหน่งทั้งหมดคั่นด้วยอักขระตัวแรกของIFSคำเดียว เนื่องจากผลลัพธ์จะขึ้นอยู่กับการแบ่งฟิลด์หากไม่ได้$@ใส่เครื่องหมายอัญประกาศ
muru

1
เพื่อให้แน่ใจว่า: $ unquote และ $ * ไม่เหมือนกันเพราะทั้งคู่จะต้องมีการแบ่งคำ ยกมา "$ @" รักษาคำแยกของพารามิเตอร์ตำแหน่งแม้ว่าพารามิเตอร์แต่ละตัวมีตัวละครใน IFS
kojiro

1
มีการอ้างอิงตั้งแต่เมื่อใดที่ใช้สำหรับเชลล์? ฉันสงสัยว่า Perl ใช้สิ่งเหล่านั้นจากการเขียนสคริปต์เชลล์หรือไม่
simbabque

สิ่งนี้ถือกำเนิด Perl โดยทศวรรษที่ผ่านมา (หรืออย่างน้อยปี) ไวยากรณ์ Perl จำนวนมากได้รับอิทธิพลจากเชลล์เชลล์ (Perl เกิดในปี 1987 และไวยากรณ์นี้มาจากเชลล์เป้าหมายเดิม (1977) ฉันไม่ได้ 100% เมื่อมีการแนะนำ $ _ แต่มันก็ค่อนข้างดีก่อนปี 1987
Popup

6

$?เป็นพารามิเตอร์เปลือกพิเศษ (ตัวแปร)

โดยทั่วไปตัวแปรทั้งหมดที่ผู้ใช้กำหนดจะต้องตั้งชื่อโดยใช้เฉพาะอักขระจากคลาสอักขระ[:alnum:]เช่น[a-zA-Z0-9_](ไม่สามารถเริ่มด้วย[0-9])

โดยสรุปแล้ว$?เป็นตัวแปรพิเศษ ( และมีไม่กี่ตัว ) ที่สามารถพิจารณาได้ว่าเป็นคุณลักษณะภายในของเชลล์ตัวเองที่ให้รหัสทางออกของคำสั่งก่อนหน้า (ไม่ว่าจะสำเร็จหรือล้มเหลว)

คุณสามารถอ่านสิ่งนี้เพื่อรับแนวคิดเพิ่มเติมเกี่ยวกับตัวแปร


4

$?เป็นตัวแปรพิเศษใน bash ที่เก็บโค้ด return / exitของคำสั่งที่เรียกใช้ล่าสุดเสมอ

echo $?คุณสามารถดูได้ในขั้วโดยการเรียกใช้

โค้ดส่งคืนอยู่ในช่วง [0; 255]
รหัสส่งคืน0มักจะหมายถึงทุกอย่างก็โอเค
ค่าอื่น ๆ ระบุถึงข้อผิดพลาด แอปพลิเคชันส่วนใหญ่ส่งคืน1หรือกำหนดค่าเอง หากไม่พบคำสั่งตัวแปรมักจะมี127

หากคุณต้องการที่จะตั้งค่าตัวแปรนี้เป็นค่าเฉพาะคุณสามารถทำเช่นนี้กับการกลับมาตัวอย่างเช่นรหัสส่งคืนbash -c "exit 5"5


ฟังก์ชั่นเชลล์เป็นวิธีที่สอดคล้องกับ POSIX ในการตั้งค่าสถานะการออกโดยไม่จำเป็นต้องฟอร์ก setstatus() { return 5; }
kojiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.