วิธีการรับองค์ประกอบจากรายการในทุบตี?


39

นี่คือรายการ:

List = "abcd 1234 jvm something"

วิธีรับองค์ประกอบที่สอง "1234" โดยไม่ต้องวนซ้ำทุกรายการ

คำตอบ:


50

ไม่มีช่องว่างระหว่างเครื่องหมายเท่ากับ

$ List="abcd 1234 jvm something"
$ set -- $List
$ echo $2
1234

บางวิธีอื่น ๆ แม้ว่าจะไม่ได้มีประสิทธิภาพเท่ากับการใช้ internals ของเชลล์

$ echo $List | cut -d" " -f2
1234
$  echo $List | awk '{print $2}'
1234
$ echo $List | sed 's/^.[^ \t]* //;s/ .*//'
1234
$ echo $List | tr " " "\n"|sed -n '2p'
1234

ขอบคุณคุณจะให้ความคิดเห็นในรหัสได้ไหม
วางไข่

1
ฉันหมายถึงบรรทัดที่สอง
วางไข่

17
@Spawn set -- $somethingแยก$somethingที่$IFSตัวละคร (โดยพื้นที่เริ่มต้น) และกำหนดส่วนแบ่งให้กับตัวแปรตำแหน่ง$1, $2...
เบนจามิน Bannier

43

เพียงเพื่อเสริมคำตอบของ ghostdog: คุณสามารถใส่$Listองค์ประกอบของอาร์เรย์และเข้าถึงองค์ประกอบรายการเฉพาะจากที่นั่น

List="abcd 1234 jvm something"
arr=($List)
echo ${arr[1]}

โปรดทราบว่าดัชนีอาร์เรย์จะถูกนับ 0,1,2, ...

สิ่งนี้มีข้อดีคือไม่ก่อให้เกิดมลพิษต่อสิ่งแวดล้อมเชลล์ด้วยตัวแปรใหม่มากเกินไป


เยี่ยมมาก :-)
SpawnST

1
ไม่จำเป็นต้องecho: arr=($List)
user31894

@ghostdog อาจเป็นพฤติกรรมที่ต้องแก้ไขแก้ไข
Benjamin Bannier

@BenjaminBannier คุณจะเลือกองค์ประกอบหลายรายการได้อย่างไร มีไวยากรณ์บางอย่างเช่น $ {arr [1,2,3]} $ (ไม่ใช่นี่ตั้งแต่ฉันลอง แต่เป็นแบบนี้) หรือฉันต้องใช้ a สำหรับลูป
Kvothe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.