ฉันเห็นสิ่งนี้ในเชลล์สคริปต์
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คุณลักษณะที่ยังพบในและรุ่นล่าสุดของbashzsh
ใน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