Score:0

จะแยกค่าข้อมูลต่างๆ ในรายการและกำหนดให้กับตัวแปรในเชลล์สคริปต์ได้อย่างไร

ธง ca

สมมติว่าฉันมีรายการข้อมูลในเชลล์สคริปต์ แบบนี้:

รายการข้อมูล = ["
แมว
หมา
กระต่าย
หนูตะเภา
หนูแฮมสเตอร์
"]

ตอนนี้ฉันจะตั้งค่าข้อมูลแต่ละค่าแยกกันในรายการเป็นตัวแปรได้อย่างไร แบบนี้:

$Value0 = "แมว"
$Valu1 = "สุนัข"
$Value2 = "กระต่าย"
$Value3 = "หนูตะเภา"
$Value4 = "แฮมสเตอร์"

ฉันคุ้นเคยกับยูทิลิตี้ commandline เช่น Grep, AWK และ SED อย่างไรก็ตาม ฉันไม่ค่อยแน่ใจว่าจะเริ่มต้นทำอะไรแบบนี้ดี

นอกจากนี้ สำหรับเร็กคอร์ด เปลือกที่ฉันชอบคือ Fish อย่างไรก็ตาม อย่าลังเลที่จะตอบในรูปแบบ BASH หรือ SH ไม่ต้องกังวล ฉันแปลได้

Score:3
ธง ca

ไม่แน่ใจว่าคุณต้องการอะไร สิ่งนี้ช่วยได้ไหม

#!/bin/bash
รายการข้อมูล=(
แมว
หมา
กระต่าย
หนูตะเภา
หนูแฮมสเตอร์
)

สำหรับฉันใน {0..4}
ทำ
    ค่า[$i]=${รายการข้อมูล[$i]}
    echo "value[$i] = ${value[$i]}"
เสร็จแล้ว

ผลลัพธ์:

ค่า [0] = แมว
ค่า [1] = สุนัข
ค่า [2] = กระต่าย
ค่า [3] = หนูตะเภา
ค่า [4] = หนูแฮมสเตอร์
MissBrae avatar
ca flag
ไม่นั่นไม่ได้ช่วยอะไร ฉันกำลังมองหาวิธีแยกวิเคราะห์สตริงในรายการและเพิ่มไปยังตัวแปรที่แยกจากกัน ฉันหมายถึงสิ่งที่ฉันเขียนตามตัวอักษร ฉันไม่ต้องการให้สตริงสุ่มออกจากรายการ
NotTheDr01ds avatar
vn flag
@MissBrae เพื่อความเป็นธรรม โซลูชันที่นี่ดูเหมือนว่าควรขยายไปยังกรณีการใช้งานของคุณได้อย่างง่ายดาย หากคุณมีรายการในจำนวนที่แน่นอน (ซึ่งดูเหมือนว่าคุณจะต้องทำ หากคุณแยกวิเคราะห์ออกเป็นตัวแปรคงที่) คุณก็ทำตามตัวอย่างของ @jpbrain ได้อย่างง่ายดายด้วย `$mem0 = $value[0]; $mem1= $value[1]; ฯลฯ ` ฉันแทนที่ "value" ด้วย "mem" เนื่องจากจากความคิดเห็นอื่นๆ ดูเหมือนว่าคุณกำลังพยายามแยกวิเคราะห์
Score:1
ธง vn

เนื่องจากเปลือกหอยที่คุณต้องการคือปลา ฉันจะเสนอสามตัวเลือก

ประการแรกกำหนดให้ รายการข้อมูล ในรูปแบบสตริง คุณสามารถใช้ แยกสตริง เพื่อแยกแต่ละบรรทัดออกเป็นรายการจริง:

> ตั้งรายการข้อมูล "
  แมว
  หมา
  กระต่าย
  หนูตะเภา
  หนูแฮมสเตอร์
  "

> ตั้ง --แสดงรายการข้อมูล

$DataList: ตั้งค่าในขอบเขตส่วนกลาง ไม่ส่งออก มี 1 องค์ประกอบ
$DataList[1]: |\nแมว\nสุนัข\nกระต่าย\nหนูตะเภา\nแฮมสเตอร์\n|

> ตั้งค่า (แยกสตริง -n \n "$DataList")
> ตั้ง --แสดงค่า

$Value: ตั้งค่าในขอบเขตส่วนกลาง ไม่ส่งออก โดยมีองค์ประกอบ 5 รายการ
$Value[1]: |แมว|
$Value[2]: |สุนัข|
$Value[3]: |กระต่าย|
$Value[4]: |หนูตะเภา|
$Value[5]: |แฮมสเตอร์|

> สะท้อน $Value[2]

หมา

^ บรรทัดว่างในตัวอย่างมีไว้เพื่อให้อ่านง่ายเท่านั้น และไม่ปรากฏในเอาต์พุตจริง

แต่ถ้าคุณทำได้ ให้ฝังข้อมูลเป็นรายการตามตัวอักษรในสคริปต์ต่อไปและหลีกเลี่ยงสิ่งที่เกินมา แยกสตริง:

> ตั้งค่า DataList "แมว" \
  "หมา" \
  "กระต่าย" \
  "หนูตะเภา" \
  "แฮมสเตอร์"

> ตั้ง --แสดงรายการข้อมูล

$DataList: ตั้งค่าในขอบเขตส่วนกลาง ไม่ส่งออก มี 5 องค์ประกอบ
$DataList[1]: |แมว|
$DataList[2]: |สุนัข|
$DataList[3]: |กระต่าย|
$DataList[4]: |กินีพิก|
$DataList[5]: |แฮมสเตอร์|

> echo $DataList[2]
หมา

สุดท้าย คำถามของคุณตามตัวอักษรคือแยกรายการออกเป็น ตัวแปรแทนที่จะเป็นตัวแปรที่มีรายการ ฉันคิดว่านั่นไม่ใช่ จริงๆ สิ่งที่คุณหมายถึง น่าจะเป็นพยาธิสภาพเล็กน้อย IMHO เนื่องจากคุณจะสูญเสียความสามารถในการนับ วนซ้ำ และจัดทำดัชนีผลลัพธ์อย่างง่ายดาย แต่ สามารถ เรียบร้อย...

กำหนดรายการข้อมูล "
แมว
หมา
กระต่าย
หนูตะเภา
หนูแฮมสเตอร์
"

set v (แยกสตริง -n \n "$DataList")

ตั้งค่า Scrpt (สำหรับ i ใน (seq (นับ $v))
             echo 'ตั้งค่า'(คณิตศาสตร์ $i-1) '"'$v[$i]'"'
           จบ)

eval (สตริงเข้าร่วม ";" $scrpt)
ชุด --erase v
ตั้งค่า -- ลบสคริปต์

ผลลัพธ์ใน:

$Value0 = "แมว"
$Value1 = "สุนัข"
$Value2 = "กระต่าย"
$Value3 = "หนูตะเภา"
$Value4 = "แฮมสเตอร์"
MissBrae avatar
ca flag
ขอบคุณ! อันสุดท้ายคือสิ่งที่ฉันต้องการ! บางทีเหตุผลที่ฉันต้องทำสิ่งนี้อาจอธิบายได้ว่าทำไม ฉันสร้างเชลล์สคริปต์เพื่อแสดงข้อมูลระบบ เช่น รุ่นโปรเซสเซอร์ จำนวนหน่วยความจำ รุ่นบอร์ดระบบ ตลอดจน OS และเวอร์ชันเคอร์เนล ฉันต้องการเพิ่มวิธีแสดงการกำหนดค่าหน่วยความจำที่แน่นอน ไม่ใช่แค่ปริมาณ ความเร็ว และจำนวนโมดูล เช่น. หน่วยความจำ: 16 GB (8 GB x 2) ฉันมีฟังก์ชันที่แยกวิเคราะห์ dmidecode และตั้งค่าจำนวนหน่วยความจำเป็น $MemoryCount และจำนวนโมดูลเป็น $ModulesInstalled และ $TotalModules ตอนนี้ฉันมีสถานที่ที่จะเริ่มต้น
MissBrae avatar
ca flag
อืม... ดูเหมือนว่ามันควรจะทำในสิ่งที่ฉันต้องการ แต่ฉันได้รับข้อผิดพลาดเมื่อฉันพยายามเรียกใช้ ฉันไม่คุ้นเคยกับลูปใน Fish ดังนั้นฉันจึงไม่สามารถดีบักมันเองได้: ~/.local/ubin/test.fish (บรรทัดที่ 13): จุดสิ้นสุดของสตริงที่ไม่คาดคิด เครื่องหมายคำพูดไม่ใช่ set scrpt ที่สมดุล (สำหรับ i ใน (seq (นับ $v)) echo 'ตั้งค่า''(คณิตศาสตร์ $i-1) '"'$v[$i]'"' จบ) eval (สตริงเข้าร่วม ";" $scrpt) ตั้ง --erase v scpt ^ ปลา: เกิดข้อผิดพลาดขณะอ่านไฟล์ /home/braelin/.local/ubin/test.fish
NotTheDr01ds avatar
vn flag
@MissBrae อ่าใช่ถ้ามันเป็นการแยกวิเคราะห์บันทึกนั่นก็สมเหตุสมผล แต่น่าจะดีกว่าที่จะโพสต์บางอย่างเช่น "ข้อมูลจริง" ที่คุณกำลังใช้ สคริปต์อาจง่ายกว่านี้ ปัญหาเกี่ยวกับเครื่องหมายคำพูดเกิดจากความผิดพลาดของฉัน -- ฉันแก้ไขแล้ว โปรดทราบว่า Fish นั้นดีพอที่จะเน้นคำพูดพิเศษ (อย่างน้อยบรรทัด) ที่มีปัญหาหากคุณวางในข้อความแจ้ง
MissBrae avatar
ca flag
ขอขอบคุณอีกครั้งสำหรับการแก้ไข! ฉันทำการแก้ไขเอง... ดูเหมือนว่าคำสั่ง 'set --erase' คาดหวังเพียง 1 อาร์กิวเมนต์และไม่มาก ดังนั้นฉันจึงแยกออกเป็นสองบรรทัด ตอนนี้ใช้งานได้ตามที่อธิบายไว้! ฉันจะจำไว้ ไม่ใช่แค่คำถาม บางทีฉันอาจจะได้รับคำตอบที่ดีกว่านี้หากฉันระบุปัญหาที่แท้จริงของฉัน ตอนนี้... ไปทำงานเพิ่มสคริปต์การรวบรวมข้อมูลระบบของฉัน!
NotTheDr01ds avatar
vn flag
@MissBrae ดูเหมือนว่า `set --erase` ที่มีหลายค่าเป็นรุ่นล่าสุดใน Fish 3.2 อย่าลืมตอบรับคำตอบ -- ขอบคุณ!
Score:0
ธง it

ฉันจะเก็บค่าไว้ในรายการที่คั่นด้วยโคลอนและใช้ "Bash Path Functions" ของ Stephen Collyer และ ตัด -d: -f3 หรือคล้ายกัน.

นี่คือหยดที่เขียนไว้ล่วงหน้าของฉัน:

ฉันใช้ bash_path_funcs ของ Stephen Collyer ซึ่งอธิบายไว้ใน Linux Journal ย้อนกลับไปในปี 2000:

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/3768 https://www.linuxjournal.com/article/3935

เดอะ เพิ่มเส้นทาง ฟังก์ชันจะเพิ่มรายการไปยังเส้นทางก็ต่อเมื่อไม่มีอยู่ตั้งแต่แรก เดลพาธ -n ลบไดเร็กทอรีที่ไม่มีอยู่ทั้งหมดออกจากเส้นทาง

คุณจะได้รับ pathfunc.tgz ไฟล์จาก https://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา