$ {1: 0: 2} หมายถึงอะไรในบริบทนี้


19

ฉันกำลังมองเข้าไปในรหัสที่แสดงด้านล่างและจะตรวจสอบการป้อนข้อมูลถ้าอาร์กิวเมนต์แถว / คอลัมน์เริ่มต้นด้วยอย่างใดอย่างหนึ่งหรือ-r -cอะไร${1:0:2}หมายถึงในบริบทนี้?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi

7
คุณควรรวมเปลือกที่คุณใช้เป็นคำถาม bashซึ่งอาจเป็น
Raphael Ahrens

2
ดูเหมือนว่าจะทำเพื่อแยกอาร์กิวเมนต์บรรทัดคำสั่ง อาจเป็นไปได้ว่าคุณต้องการรู้เกี่ยวกับgetoptหรือgetoptsทำให้ชีวิตของคุณง่ายขึ้น (หรือชีวิตของคนที่ทำสิ่งนี้)
Carlos Campderrós

คำตอบ:


31

มันเป็นรูปแบบของ Substring Expansion (subclass ของ Parameter Expansion) ของเชลล์

รูปแบบคือ:

${parameter:offset:length}

และการจัดทำดัชนีเริ่มต้นที่ 0

สมมติว่าคุณมีตัวแปรfooจากนั้น${foo:0:2}ให้อักขระสองตัวแรก (จากตำแหน่ง 0 ถึง 2 ถัดไป)

ตัวอย่าง:

$ foo=spamegg
$ echo "${foo:0:2}"
sp

ในกรณีของคุณหมายเลขแรก1หมายถึงชื่อตัวแปร$1ซึ่งเป็นอาร์กิวเมนต์แรกที่ส่งผ่านทางบรรทัดคำสั่ง (ในโปรแกรมหลัก) หรืออาร์กิวเมนต์แรกที่ส่งผ่านไปยังฟังก์ชัน

ดังนั้นในกรณีของคุณ"${1:0:2}"จะ:

  • เริ่มต้นการแยกสตริงย่อยเริ่มต้นจากดัชนี 0 เช่นตัวอักษรตัวแรก

  • และดำเนินการต่อจนถึงอักขระสองตัวถัดไป

ดังนั้นหลังจากการดำเนินการคุณจะได้รับอักขระสองตัวแรก (ดัชนีที่ 0 และ 1) ของสตริงอินพุต

[ "${1:0:2}" != $rowArgName ]และ[ "${1:0:2}" != $colArgName ]กำลังตรวจสอบถ้า subtring การส่งออกเท่ากับสตริงอื่น ๆ บาง


1
เป็นหลักมันคือการตรวจสอบหรือไม่ว่าผู้ใช้ให้ $ 1 ด้วย-cหรือ-rซึ่งอาจได้รับการดำเนินการที่ดีขึ้นด้วยgetopts
Sergiy Kolodyazhnyy

15

สารสกัดขนาดเล็กจาก man bash :

$ {พารามิเตอร์: offset: ความยาว}

การขยายตัว substring ขยายไปถึงlengthตัวละครของมูลค่า เริ่มต้นที่ตัวอักษรตามที่ระบุไว้parameter offsetหากพารามิเตอร์คือ@อาร์เรย์ที่มีการทำดัชนีห้อย@หรือ*หรือชื่ออาเรย์แบบเชื่อมโยงผลลัพธ์จะแตกต่างกันตามที่อธิบายไว้ด้านล่าง หากlengthไม่ระบุไว้ให้ขยายไปยังสตริงย่อยของค่าparameterเริ่มต้นที่อักขระที่ระบุโดยoffset และขยายไปถึงจุดสิ้นสุดของค่า length และ offset เป็นนิพจน์ทางคณิตศาสตร์ (ดูการประเมิน ARITHMETIC ด้านล่าง)


5

นี่คือการแยกสตริงย่อยอย่างง่ายจากตัวแปร ตัวแปรที่เป็นปัญหาคือพารามิเตอร์ตัวแรกของสคริปต์ (ซึ่งก็คือ1 )

ถ้าผมมีตัวแปร FOO ${FOO:0:2}ฉันสามารถดูตัวละครสองตัวแรกของความคุ้มค่าด้วย ในตัวอย่างของคุณกำลังทำสิ่งเดียวกันโดยมีอาร์กิวเมนต์แรก

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