Score:0

bash เชื่อมสตริงในลูปผลลัพธ์เป็นสตริงว่าง

ธง mx

ฉันมีไฟล์ต่อไปนี้

สวัสดี
โลก
ของฉัน
ชื่อ
เป็น
ฟอลโคเจอร์

และฉันต้องการต่อสตริงของแต่ละบรรทัด

ฉันเขียนสคริปต์ต่อไปนี้เพื่อทำสิ่งนั้น

#! /usr/bin/ทุบตี
myFile=/home/FalcoGer/testfile.txt

ผลลัพธ์ = ""
แมว $myFile | ขณะอ่านไลน์
ทำ
  ผลลัพธ์+="$บรรทัด"
เสร็จแล้ว

echo ผลลัพธ์: $result

อย่างไรก็ตามฉันได้รับเท่านั้น ผลลัพธ์: ด้วยสตริงว่าง เมื่อฉันพิมพ์จากภายในลูปดูเหมือนว่าจะทำงานได้ดี เกิดอะไรขึ้นกับสคริปต์นี้และฉันจะแก้ไขได้อย่างไร

uz flag
Jos
คุณไม่สามารถต่อสตริงแบบนั้นใน bash ได้ ลอง `result="$result $line"`
hr flag
ดู [เหตุใดตัวแปรของฉันจึงอยู่ในลูป 'ขณะอ่าน' หนึ่งลูป แต่ไม่ใช่ในลูปอื่นที่ดูเหมือนคล้ายกัน](https://unix.stackexchange.com/questions/9954/why-is-my-variable-local-in -one- while-read-loop-but-not-in-other-likely)
FalcoGer avatar
mx flag
@Jos ใช่คุณทำได้ `+=` เป็นตัวดำเนินการที่ถูกต้องใน bash https://stackoverflow.com/questions/4181703/how-to-concatenate-string-variables-in-bash
waltinator avatar
it flag
วางสคริปต์ของคุณใน `https://shellcheck.net` ซึ่งเป็นตัวตรวจสอบไวยากรณ์เสมอ หรือติดตั้ง `shellcheck` ในเครื่อง ใช้ 'shellcheck' เป็นส่วนหนึ่งของกระบวนการพัฒนาของคุณ นอกจากนี้ช่องว่างในบรรทัดแรกยังผิดอีกด้วย ใช้ "`#!/bin/bash`"
uz flag
Jos
วันนี้ฉันได้เรียนรู้ :-)
hr flag
BTW ฉันถือว่าคุณแค่ใช้สิ่งนี้เป็นแบบฝึกหัดเพื่อเรียนรู้เกี่ยวกับลูป - ถ้าไม่ มีตัวเลือกที่ดีกว่าเช่น `result=$(paste -sd ' '
FalcoGer avatar
mx flag
@steeldriver จริง ๆ แล้วฉันใช้สิ่งนี้เพื่อดาวน์โหลดเนื้อหาเวิร์กชอปจาก steamcmd โดยใช้ไฟล์ข้อความ ฉันเพิ่งทำลายมันลงสำหรับตัวอย่างขั้นต่ำ ฉันชอบที่จะมีไวยากรณ์ที่อ่านได้ง่ายกว่าแบบสั้น ฉันต้องประมวลผล `$line` ไม่ว่าในกรณีใด ๆ ดังนั้นฉันจึงต้องวนซ้ำ
hr flag
หากคุณจำเป็นต้องประมวลผลบรรทัด นั่นเป็นเหตุผลที่ **ไม่ใช่** มากกว่าที่จะใช้เชลล์ลูป ดูตัวอย่าง [เหตุใดการใช้เชลล์ลูปเพื่อประมวลผลข้อความจึงถือว่าไม่เหมาะสม](https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text -ถือเป็นข้อปฏิบัติที่ไม่ดี)
Score:4
ธง mx

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

#! /usr/bin/ทุบตี
myFile=/home/FalcoGer/testfile.txt

ผลลัพธ์ = ""
ในขณะที่อ่าน -r บรรทัด
ทำ
  ผลลัพธ์+="$บรรทัด"
เสร็จแล้ว < $myFile

echo ผลลัพธ์: $result
cn flag
นี่คือ [BashFAQ 24](http://mywiki.wooledge.org/BashFAQ/024)
bac0n avatar
cn flag
คุณมักจะต้องการเพิ่ม `-r` เพื่ออ่าน
FalcoGer avatar
mx flag
@bac0n ก็จะปรากฏเช่นนั้น

โพสต์คำตอบ

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