ตัวแปรเชลล์สัญลักษณ์ดอลลาร์พิเศษคืออะไร?


781

ใน Bash มีตัวแปรหลายตัวที่เก็บค่าพิเศษที่มีความหมายสม่ำเสมอ ตัวอย่างเช่น

./myprogram &; echo $!

จะกลับ PID ของกระบวนการที่ myprogrambackgrounded ฉันรู้จักผู้อื่นเช่น$?ที่ฉันคิดว่าเป็น TTY ปัจจุบัน มีคนอื่นไหม?


15
หลายคนไม่ใช่ Bash-only พวกเขากำลังยังใช้ในการอื่น ๆ เปลือกหอยบอร์นที่เกี่ยวข้องและในความเป็นจริงที่ระบุไว้โดยPOSIX
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
อะไรที่เกี่ยวกับ: IFS = $ '\ n' ดู: stackoverflow.com/questions/4128235//
sgu

1
@sgu นั่นไม่ใช่พารามิเตอร์ นั่นเป็นข้อความพิเศษชนิดหนึ่ง $'\n'เป็นอักขระขึ้นบรรทัดใหม่ตามตัวอักษรซึ่งเป็นผลมาจากการแทนที่ digraph \nด้วย ASCII 10
chepner

หากคุณมาที่นี่มองหา${1}, ${*}ฯลฯ การจัดฟันเป็นเพียงสำหรับการแก้ความกำกวมและมักจะซ้ำซ้อน ในการแยกเป็นว่าเทียบเท่ากับ${x} $x
tripleee

อะไร$!หมายถึง? ฉันรู้!$แต่ไม่ว่า
Sridhar Sarnobat

คำตอบ:


1358
  • $1, $2, $3... เป็นพารามิเตอร์ตำแหน่งพารามิเตอร์ตำแหน่ง
  • "$@" เป็นโครงสร้างแบบอาเรย์ของพารามิเตอร์ตำแหน่งทั้งหมด {$1, $2, $3 ...} .
  • "$*" คือการขยาย IFS ของพารามิเตอร์ตำแหน่งทั้งหมด $1 $2 $3 ... .
  • $# คือจำนวนพารามิเตอร์ตำแหน่ง
  • $- ตัวเลือกปัจจุบันที่ตั้งค่าไว้สำหรับเชลล์
  • $$ pid ของเชลล์ปัจจุบัน (ไม่ใช่ subshell)
  • $_ พารามิเตอร์ล่าสุด (หรือพา ธ abs ของคำสั่งเพื่อเริ่มเชลล์ปัจจุบันทันทีหลังจากเริ่มต้น)
  • $IFS เป็นตัวคั่นฟิลด์ (อินพุต)
  • $? เป็นสถานะการออกส่วนหน้าไปข้างหน้าล่าสุด
  • $! เป็น PID ของคำสั่งพื้นหลังล่าสุด
  • $0 เป็นชื่อของเชลล์หรือเชลล์สคริปต์

ส่วนใหญ่ข้างต้นสามารถพบได้ภายใต้พารามิเตอร์พิเศษในคู่มืออ้างอิง Bash มีตัวแปรสภาพแวดล้อมทั้งหมดที่เชลล์กำหนด

สำหรับดัชนีที่ครอบคลุมโปรดดูเอกสารอ้างอิงดัชนีตัวแปรคู่มือการใช้งาน


2
พวกเขาทั้งหมดมีการบันทึกไว้ในbashหน้าคน สิ่งแปลกประหลาดเพียงอย่างเดียวคือที่$_กล่าวถึงเฉพาะในบริบทของการใช้งานในMAILPATHตัวแปร
chepner

4
ดู @chepner ในman(1) bashภายใต้พารามิเตอร์พิเศษ$_สำหรับส่วนที่เหลือของคำนิยามของ
kojiro

8
ฉันใช้!$แทน$_สคริปต์ทุบตีเพราะบางครั้งก็ล้มเหลว
AMC

รายการที่ดี kojiro ฉันพบไวยากรณ์นี้ $ {1 + "$ @"} นั่นหมายความว่าอย่างไร
user178047

3
@amc: ดูunix.stackexchange.com/questions/271659/...สำหรับความแตกต่างระหว่างและ!$ $_
tricasse

44
  • $_ อาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้าย
  • $# จำนวนข้อโต้แย้งที่ส่งผ่านไปยังสคริปต์ปัจจุบัน
  • $*/ $@รายการของอาร์กิวเมนต์ที่ส่งผ่านไปยังสคริปต์เป็นรายการสตริง / คั่น

ปิดส่วนหัวของฉัน Google สำหรับทุบตีตัวแปรพิเศษ


124
"ฉันทำได้พวกเขาส่งฉันมาที่นี่" - Bookshop skit (doc อย่างเป็นทางการ: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo

1
ฉันคิดว่า$@เป็นสายอักขระและ$*เป็นรายการที่คั่นด้วย (ตามคำตอบที่ยอมรับแล้วข้างต้น)
RastaJedi

1
@RastaJedi: "$@"ขยายไปยังรายการ"$*"ขยายเป็นสตริงเดียว พฤติกรรมพิเศษของ$@นำไปใช้เมื่ออยู่ในเครื่องหมายคำพูดคู่
Keith Thompson

6
ลงเนื่องจากนี่ไม่ใช่คำตอบที่สมบูรณ์หรือมีประโยชน์ การพูดว่า "Google it" แสดงว่าขาดความพยายามโดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่าคนส่วนใหญ่จบลงที่นี่จากการค้นหาของ Google ฉันคิดว่าอย่างน้อยคุณสามารถทำได้คือเพิ่มลิงค์ไปยังเอกสารอย่างเป็นทางการ TBH เหตุผลเดียวที่ฉันไม่ได้ตั้งค่าสถานะเพื่อลบคือเพราะอย่างน้อยก็มีคำตอบบางส่วนสำหรับคำถาม ฉันรู้ว่ามันเก่า แต่โปรดพิจารณาแก้ไขเพื่อให้รายละเอียดเพิ่มเติม
Sean the Bean

15

ที่จะช่วยให้เข้าใจในสิ่งที่ไม่$#, $0และ$1, ... , $nทำผมใช้สคริปต์นี้:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

การรันมันจะคืนค่าเอาต์พุตตัวแทน:

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine

4
ฉันหมายถึงอะไรในลูปของคุณ? นั่นคือเหตุผลที่ฉันมาที่นี่และฉันไม่สามารถหาคำตอบได้ทุกที่เพราะฉันไม่รู้ว่าจะเรียกมันว่าอะไร
Anthony

7
@Anthony นี้เรียกว่าร้ายตัวแปร คุณสามารถหาคำอธิบายที่ดีเกี่ยวกับการใช้งานของเขาในbash: การขยายตัวทางอ้อมได้โปรดอธิบาย? .
fedorqui 'ดังนั้นหยุดการทำร้าย'

3

ดูแลตัวอย่างบางส่วน $ 0 อาจรวมถึงเส้นทางนำบางส่วนเช่นเดียวกับชื่อของโปรแกรม เช่นบันทึกสคริปต์สองบรรทัดนี้เป็น. / mytry.sh และรันมัน

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

เอาท์พุท:

parameter 0 --> ./mytry.sh

นี่เป็นเวอร์ชั่น Bash ปัจจุบัน (ปี 2559) ผ่าน Slackware 14.2


5
ไม่ว่าจะเป็น $ 0 รวมถึงเส้นทางหรือไม่ขึ้นอยู่กับวิธีที่คุณเรียกใช้สคริปต์ในครั้งแรก หากคุณดำเนินการ "./mytry.sh" นั่นคือสิ่งที่คุณจะเห็นใน $ 0 หากคุณป้อน "~ / mytry.sh" คุณจะเห็นเส้นทางแบบเต็ม (เพราะเชลล์จะขยาย ~) หากคุณทำ ". mytry.sh" คุณจะเห็น 'ทุบตี'
Steve Folly
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.