ฉันเห็นสิ่งนี้ในเชลล์สคริปต์
variable=${@:2}
มันทำอะไรอยู่?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
ดูความแตกต่าง?
ฉันเห็นสิ่งนี้ในเชลล์สคริปต์
variable=${@:2}
มันทำอะไรอยู่?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
ดูความแตกต่าง?
คำตอบ:
มันแสดงเนื้อหาของตัวแปรพิเศษ$@
ใน Bash variable
มันมีทุกอาร์กิวเมนต์บรรทัดคำสั่งและคำสั่งนี้คือการขัดแย้งทั้งหมดจากคนที่สองและเก็บไว้ในตัวแปร
นี่คือสคริปต์ exampe
#!/bin/bash
echo ${@:2}
variable=${@:3}
echo $variable
ตัวอย่างการเรียกใช้:
./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5
vars=( "${@:2}" )
$@
และ${@}
เหมือนกันแม้ว่าส่วนหลังจะเป็นไวยากรณ์ "ที่ถูกต้องมากกว่า" คุณต้องใช้วงเล็บด้วย${@:2}
เพราะ$@:2
คลุมเครือและดังนั้นจึงถูกตีความว่าเป็น${@}:2
สิ่งที่ไม่เหมือนกัน
นั่นเป็นksh
คุณลักษณะที่ยังพบในและรุ่นล่าสุดของbash
zsh
ในksh
และbash
คุณสามารถเข้าถึงองค์ประกอบต่าง ๆ ของอาร์เรย์ได้โดยใช้${array[@]:first:length}
ไวยากรณ์ซึ่งขยายองค์ประกอบlength
(หรือทั้งหมดหากlength
ละเว้น) ของarray
อาร์เรย์ (ในรายการองค์ประกอบของอาร์เรย์ที่เรียงลำดับตัวเลขในดัชนี) เริ่มต้นด้วย first
คนแรกที่มีมากขึ้นดัชนีหรือเท่ากับ เมื่ออยู่ในบริบทเกลา (เช่นที่นี่ในการมอบหมายให้กับตัวแปรสเกลาร์) รายการขององค์ประกอบที่จะเข้าร่วมกับตัวละครที่มีพื้นที่bash
และksh93
และมีอักษรตัวแรกของ$IFS
(หรืออะไรถ้า$IFS
เป็นที่ว่างเปล่าหรือพื้นที่ถ้ามันไม่มีการตั้งค่า) zsh
ด้วย
ตัวอย่างเช่น
$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>
$@
เป็นกรณีพิเศษ $@
คืออาร์เรย์ของพารามิเตอร์ตำแหน่ง ( $1
, $2
... ) แต่เมื่อนำมาใช้กับ:
, $0
นอกจากนี้ยังรวมถึง ดังนั้น${@:1}
เหมือนกับ$@
ไม่${@:0}
เหมือนกับอาร์เรย์อื่น ๆ
ในzsh
มันแตกต่างกันเล็กน้อย zsh
เพิ่มksh
ไวยากรณ์เฉพาะเมื่อเร็ว ๆ นี้เพื่อความเข้ากันได้ แต่มีไวยากรณ์ของตัวเองสำหรับการเลือกช่วงขององค์ประกอบ
ตรงกันข้ามกับksh
และbash
, zsh
อาร์เรย์เป็นชนิดตัวแปรที่แตกต่างจากตัวแปรสเกลาร์, ไม่กระจัดกระจาย ( zsh
มีการเชื่อมโยงอาร์เรย์เป็นตัวแปรชนิดอื่น) และเริ่มที่ดัชนี 1 แทน 0
สำหรับzsh
คุณจะเข้าถึงองค์ประกอบอาร์เรย์ด้วย$a[first,last]
(ซึ่งlast
อาจเป็นค่าลบเพื่อนับถอยหลังจากตอนท้าย)
ในzsh
,
a[23]=a a[5]=b a[235]=c a[45]=d
สร้างอาร์เรย์ที่มีองค์ประกอบ 235 รายการโดยส่วนใหญ่จะว่างเปล่า $a[12,50]
จะขยายไปยังองค์ประกอบ 12 ถึง 50 และ${a[@]:12:2}
จะขยายเป็น (ว่าง) $a[12]
และ$a[13]
องค์ประกอบเท่านั้น เป็นกรณีพิเศษและอีกครั้งสำหรับการพกพาด้วยksh93
และbash
, zsh
ยังยอมรับ0
องค์ประกอบแรกสำหรับและขนมที่เป็น$@
$0
ดังนั้นคุณสามารถใช้${a[@]:x:n}
และ${@:x:n}
พกพาได้ทั้ง 3 เชลล์ แต่เฉพาะสำหรับอาร์เรย์ที่ไม่กระจัดกระจายและใส่ใจกับค่าของ IFS