$ {@: 2} นี้หมายความว่าอย่างไรในการเขียนสคริปต์เชลล์


27

ฉันเห็นสิ่งนี้ในเชลล์สคริปต์

variable=${@:2}

มันทำอะไรอยู่?


นั่นเป็นวิธีที่แสดงในสคริปต์หรือไม่ ไวยากรณ์ดูเหมือนอาร์เรย์ แต่ไม่มีบางส่วน คุณช่วยโพสต์ข้อความสองบรรทัดรอบบรรทัดนี้จากสคริปต์ได้ไหม
slm

นั่นคือตัวแปรที่เริ่มต้นจากตัวอักษรตัวที่สอง var="my_value"; echo var="${var[@]:2}"; echo "$var"ดูความแตกต่าง?
Valentin Bajrami

คำตอบ:


34

มันแสดงเนื้อหาของตัวแปรพิเศษ$@ใน 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

อ้างอิง


9
โปรดทราบว่าเทคนิคที่แสดงให้เห็นการบดบังข้อโต้แย้งที่กำหนดลงในสายเดียว หากคุณต้องการเก็บไว้เป็นอาร์กิวเมนต์แยกให้ใช้อาร์เรย์:vars=( "${@:2}" )
glenn jackman

@glennjackman - ขอบคุณที่ชี้ให้เห็น
slm

2
โปรดสังเกตการใช้วงเล็บปีกกา คุณควรใช้เครื่องหมายปีกกาเสมอ แต่ Bash อนุญาตให้คุณละเว้นเมื่อบริบทไม่ชัดเจน ดังนั้น$@และ${@}เหมือนกันแม้ว่าส่วนหลังจะเป็นไวยากรณ์ "ที่ถูกต้องมากกว่า" คุณต้องใช้วงเล็บด้วย${@:2}เพราะ$@:2คลุมเครือและดังนั้นจึงถูกตีความว่าเป็น${@}:2สิ่งที่ไม่เหมือนกัน
Paddy Landau

14

นั่นเป็น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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.