Tôi có một biến tập lệnh đa dòng. Làm cách nào để vượt qua biến này để đọc từng dòng và xử lý từng dòng theo cách tôi muốn?Đọc từng dòng một từ một biến trong kịch bản lệnh vỏ
Trả lời
Hãy xem xét những điều sau nhiều dòng biến
x=$(echo -e "a\nb\nc d e")
và một quá trình đơn giản cho mỗi dòng: chỉ echo
nó với một prefix = LINE:
và với dấu nháy đơn xung quanh dòng. Một trong các mã sau đây sẽ làm hài lòng yêu cầu rằng:
while read line; do echo "LINE: '${line}'"; done <<< "$x"
hoặc
while read line; do echo "LINE: '${line}'"; done < <(echo "$x")
Không tạo ra một subshell (để bạn có thể, ví dụ, thiết lập các biến trong vòng lặp và truy cập chúng bên ngoài của nó), và cả hai đầu ra
LINE: 'a'
LINE: 'b'
LINE: 'c d e'
Nhưng giả sử thay vào đó bạn có
x=$(echo -e "a \n b\nc d e")
# note--------^--^
và vấn đề khoảng trắng ở đầu và cuối cho ứng dụng của bạn (ví dụ: phân tích cú pháp sứ Git). Cả hai mã trên sẽ cung cấp cho chính xác cùng một đầu ra cho các biến sau/dữ liệu như cho các cựu, mà không phải là những gì bạn muốn. Để giữ khoảng trắng ở đầu và cuối, thay thế while read line
bằng while IFS= read -r line
. Ví dụ, một trong các mã sau
while IFS= read -r line; do echo "LINE: '${line}'"; done <<< "$x"
hoặc
while IFS= read -r line; do echo "LINE: '${line}'"; done < <(echo "$x")
sẽ sản xuất
LINE: 'a '
LINE: ' b'
LINE: 'c d e'
Xem Greg Wooledge's excellent Bash FAQ để biết chi tiết.
Mặc dù tôi thường sử dụng "khi đọc" để xử lý các biến nhiều dòng, gần đây tôi đã có một trường hợp nó xóa không gian hàng đầu khỏi mỗi dòng trong một tệp. Sử dụng này thay vì cố định vấn đề của tôi:
printf %s "$var" | while IFS= read -r line
do
echo "$line"
done
Mã lấy từ this Unix Stack Exchange answer.
- 1. Cách gói một dòng lệnh Kịch bản lệnh Python
- 2. Kịch bản lệnh vỏ và bảo mật
- 3. Java: Đọc dòng lệnh mới từ một tệp văn bản
- 4. Làm thế nào để vượt qua một biến TỪ TỪ TỪ một kịch bản lệnh shell?
- 5. Các hàm ẩn danh trong các kịch bản lệnh vỏ
- 6. Làm thế nào để vượt qua một biến trong một lệnh curl trong kịch bản shell
- 7. Tạo một kịch bản chấp nhận đối số dòng lệnh
- 8. vỏ kịch bản + số tiền
- 9. Cách đọc một dòng từ một tệp trong PowerShell
- 10. Làm thế nào để đọc từng dòng từ một vùng văn bản
- 11. Đọc từ đường ống theo từng dòng trong C
- 12. Vấn đề số học với kịch bản lệnh vỏ
- 13. Thực hiện kịch bản lệnh python theo từng dòng bằng cách sử dụng C++ Python API
- 14. Tạo các kịch bản máy chủ SQL từ dòng lệnh?
- 15. chạy kịch bản hấp dẫn từ dòng lệnh
- 16. Đọc các dòng bắt đầu từ một số dòng trong tập lệnh bash
- 17. Run ba vỏ kịch bản đồng thời
- 18. lệnh unix để đọc dòng từ một tệp bằng cách chuyển số dòng
- 19. Đọc từng dòng tệp (có khoảng trắng) trong tập lệnh Unix Shell - Số phát hành
- 20. Đếm các giá trị duy nhất trong một cột có một kịch bản lệnh shell
- 21. Đầu ra lệnh của kịch bản lệnh Bash vào biến
- 22. Áp dụng bản vá từng dòng
- 23. biến trong kịch bản TOAD
- 24. Đi qua một chuỗi đa dòng như một tham số để một kịch bản trong Windows
- 25. số từ của mỗi dòng trong một tập lệnh
- 26. Biến số tự động trong kịch bản lệnh shell
- 27. 'echo' mà không xuống dòng trong một kịch bản shell
- 28. Gửi thông số yêu cầu khi gọi một kịch bản PHP thông qua dòng lệnh
- 29. đơn dòng lệnh if trong một kịch bản shell không làm việc
- 30. Gọi một kịch bản PowerShell từ Python
đây là giải pháp hoàn hảo, chỉ tò mò thôi, tại sao không chỉ x = "a \ nb \ nc d e"? –
@ SenthilKumar, chuỗi đó chứa 10 charactes: 'a', '\', 'n', 'b', v.v ... "\ n" không phải là dấu ngoặc kép đặc biệt bên trong. Trong bash, người ta có thể viết '$" một \ nb \ nc d e "' để có các dòng mới thực được nhúng trong chuỗi. Cờ "-e" cho 'echo' xử lý" \ n "làm dòng mới chứ không phải hai ký tự indvidual. – chepner
@chepner: thx, '$' là mới đối với tôi, nhưng nó hoạt động với dấu nháy đơn '$' một \ nb \ nc d e'' –