Điểm:0

bash nối chuỗi trong vòng lặp dẫn đến chuỗi rỗng

lá cờ mx

Tôi có tập tin sau

Xin chào
Thế giới
của tôi
Tên
Là
FalcoGer

Và tôi muốn nối các chuỗi của mỗi dòng.

Tôi đã viết đoạn script sau để làm điều đó.

#! /usr/bin/bash
myFile=/home/FalcoGer/testfile.txt

kết quả = ""
con mèo $myFile | trong khi đọc dòng
làm
  kết quả+="$dòng"
xong

echo Kết quả: $result

Tuy nhiên tôi chỉ nhận được Kết quả: với một chuỗi rỗng. Khi tôi in nó từ trong vòng lặp, nó có vẻ hoạt động tốt. Có gì sai với tập lệnh này và làm cách nào để khắc phục?

lá cờ uz
Jos
Bạn không thể nối các chuỗi như thế trong bash. Hãy thử `result="$result $line"` .
lá cờ hr
Xem [Tại sao biến của tôi cục bộ trong một vòng lặp 'trong khi đọc', mà không phải trong một vòng lặp khác có vẻ tương tự?](https://unix.stackexchange.com/questions/9954/why-is-my-variable-local-in -one-while-read-loop-but-not-in-other-dường như)
FalcoGer avatar
lá cờ mx
@Jos vâng, bạn có thể. `+=` là toán tử hợp lệ trong bash. https://stackoverflow.com/questions/4181703/how-to-concatenate-string-variables-in-bash
waltinator avatar
lá cờ it
Luôn dán tập lệnh của bạn vào `https://shellcheck.net`, trình kiểm tra cú pháp hoặc cài đặt `shellcheck` cục bộ. Hãy biến việc sử dụng `shellcheck` thành một phần trong quy trình phát triển của bạn. Ngoài ra, khoảng trống trên dòng đầu tiên là sai. Sử dụng "`#!/bin/bash`".
lá cờ uz
Jos
Ngày hôm nay tôi đã học :-)
lá cờ hr
Nhân tiện, tôi cho rằng bạn chỉ đang sử dụng điều này như một bài tập để tìm hiểu về các vòng lặp - nếu không, có các tùy chọn tốt hơn chẳng hạn như `result=$(paste -sd ''
FalcoGer avatar
lá cờ mx
@steeldriver thực sự tôi sử dụng cái này để tải xuống nội dung hội thảo từ steamcmd bằng tệp văn bản. Tôi chỉ phá vỡ nó cho ví dụ tối thiểu. Tôi thích có cú pháp dễ đọc hơn cú pháp ngắn. Tôi cần xử lý `$line` trong mọi trường hợp, vì vậy tôi cần một vòng lặp.
lá cờ hr
Nếu bạn cần xử lý các dòng, đó thường là lý do **không** để sử dụng vòng lặp trình bao. Xem ví dụ [Tại sao sử dụng vòng lặp trình bao để xử lý văn bản được coi là thông lệ không tốt?](https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text -được coi là-xấu-thực hành)
Điểm:4
lá cờ mx

Về cơ bản, việc sử dụng đường ống sẽ tạo ra một tập lệnh mới với phạm vi mới. Bạn có thể tránh đường ống như vậy:

#! /usr/bin/bash
myFile=/home/FalcoGer/testfile.txt

kết quả = ""
trong khi đọc dòng -r
làm
  kết quả+="$dòng"
xong < $myFile

echo Kết quả: $result
lá cờ cn
Đây là [BashFAQ 24](http://mywiki.wooledge.org/BashFAQ/024)
bac0n avatar
lá cờ cn
Bạn thường muốn thêm `-r` để đọc.
FalcoGer avatar
lá cờ mx
@bac0n nó sẽ hiện ra như vậy.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.