Score:0

คุณจะกำหนดอาร์กิวเมนต์ตำแหน่งใหม่อย่างไรเพื่อให้ใช้งานได้นอกฟังก์ชัน

ธง us

ฉันกำลังพยายามสร้าง #!/bin/sh ฟังก์ชัน string_split ที่เข้ากันได้ซึ่งมีไวยากรณ์คำสั่งที่คล้ายกันกับคำสั่ง read เพื่อให้คุณสามารถส่งผ่านสตริงที่คุณต้องการแยกและตัวแปรที่คุณต้องการกำหนดสตริงด้วย

นี่คือฟังก์ชันที่ฉันคิดขึ้นมา แต่ฉันไม่สามารถหาวิธีทำให้ค่าใหม่ที่มีอยู่นอกฟังก์ชันเหมือนกับที่คำสั่ง read ทำได้

#!/bin/sh
split_str() {
    input_original=$1
    อินพุต = $1
    input_delimiter=$2

    อินพุต=$(เสียงสะท้อน "$อินพุต" | sed -e "s/$input_delimiter/ /g")
    ชุด -- "$input_original" "$input_delimiter" $อินพุต
}

การใช้คำสั่งที่ต้องการจะมีลักษณะดังนี้:

split_str "สวัสดีชาวโลก" " " word1 word2
เสียงสะท้อน "$word1"
# เอาต์พุต: สวัสดี
เสียงสะท้อน "$word2"
# เอาต์พุต: โลก

สารละลาย

การใช้คำตอบของ bac0ns ด้านล่างฉันสามารถรับโซลูชันนี้ซึ่งใช้งานได้กับพารามิเตอร์เอาต์พุตจำนวนเท่าใดก็ได้ที่ส่งผ่าน ขอบคุณสำหรับความช่วยเหลือ @bac0n

#!/bin/sh
split_str() {
    อินพุต = $1
    input_delimiter=$2
    
    # แยกพารามิเตอร์เอาต์พุต
    output_params=$(echo "${@}" | sed -e "s/$input $input_delimiter//g")

    # เพิ่มอาร์กิวเมนต์ตัวแปรพิเศษเพื่อตรวจจับการล้น
    # สิ่งนี้จะป้องกันไม่ให้ส่วนพิเศษใด ๆ ของสตริงย่อยถูกเพิ่มลงใน
    #ผ่านพารามิเตอร์ 
    output_params="$output_params ล้น"

    # แยกสตริงโดยการอ่านค่าด้วยการอ่าน
    IFS="$input_delimiter" อ่าน -r $output_params << EOF
1 ดอลลาร์
อฟ
}
kevincorrigan avatar
us flag
@Terrance คุณช่วยขยายความได้ไหม ถ้าฉันเพิ่ม return $input ในฟังก์ชันของฉัน ฉันได้รับข้อผิดพลาด "จำเป็นต้องมีอาร์กิวเมนต์ที่เป็นตัวเลข"
Terrance avatar
id flag
ขอโทษด้วย ฉันใช้มันเพื่อคืนค่า 0 หรือ 1 เมื่อฉันเรียกฟังก์ชันว่าจริงหรือเท็จ
bac0n avatar
cn flag
/bin/sh (เส้นประ) เป็นข้อกำหนดหรือไม่
kevincorrigan avatar
us flag
@bac0n ใช่ /bin/sh เป็นสิ่งจำเป็น
Score:2
ธง cn

ฟังก์ชันทำงานในบริบทเดียวกับเชลล์ปัจจุบัน ตั้งค่าได้อย่างสมบูรณ์แบบ คำที่ 1 และ คำที่ 2 ภายในฟังก์ชั่นและใช้จากขอบเขตการโทร:

แยก(){
    ท้องถิ่น a=$1 b=$2
    กะ2
    IFS=$b อ่าน -r $@ _ << \
อฟ
    $a
อฟ
}

แยก "สวัสดีชาวโลก" " " คำ1 คำ2

พิมพ์f %s\n "1:$word1" "2:$word2"
kevincorrigan avatar
us flag
ขอขอบคุณ! นี่ไม่ใช่สิ่งที่ฉันต้องการ แต่มันชี้ให้ฉันไปในทิศทางที่ถูกต้อง ฉันจะอัปเดตคำถามด้วยฟังก์ชันใหม่ของฉัน

โพสต์คำตอบ

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