2016-06-29 18 views
9

Tôi có một biến số FOO với tôi cần được chỉ định với một giá trị sẽ có nhiều dòng. Một cái gì đó như thế này,Cách chỉ định giá trị nhiều dòng cho biến bash

FOO="This is line 1 
    This is line 2 
    This is line 3" 

Vì vậy, khi tôi in giá trị của FOO nó sẽ cho kết quả như sau.

echo $FOO 
output: 
This is line 1 
This is line 2 
This is line 3 

Hơn nữa, số dòng sẽ được quyết định động như tôi sẽ khởi tạo nó bằng vòng lặp.

Câu trả lời được hiển thị trong câu hỏi khác sử dụng chủ yếu là read -d không phù hợp với tôi khi tôi đang thực hiện các hoạt động chuỗi chuyên sâu và định dạng mã cũng quan trọng.

+2

Remove khoảng trắng đầu trong dòng 2 và 3 và sử dụng: 'echo "$ FOO"' – Cyrus

Trả lời

22

Đừng thụt dòng hoặc bạn sẽ nhận được thêm dấu cách. Sử dụng dấu ngoặc kép khi bạn mở rộng "$FOO" để đảm bảo các dòng mới được giữ nguyên.

$ FOO="This is line 1 
This is line 2 
This is line 3" 
$ echo "$FOO" 
This is line 1 
This is line 2 
This is line 3 

Một cách khác là sử dụng \n chuỗi thoát. Chúng được diễn giải bên trong các chuỗi $'...'.

$ FOO=$'This is line 1\nThis is line 2\nThis is line 3' 
$ echo "$FOO" 

Một cách thứ ba là để lưu trữ các ký tự \n, và sau đó có echo -e giải thích các trình tự thoát. Đó là một sự khác biệt tinh tế. Phần quan trọng là \n không được diễn giải bên trong các trích dẫn thông thường.

$ FOO='This is line 1\nThis is line 2\nThis is line 3' 
$ echo -e "$FOO" 
This is line 1 
This is line 2 
This is line 3 

Bạn có thể thấy sự khác biệt Tôi đang làm nếu bạn loại bỏ tùy chọn -e và có echo in chuỗi thô mà không giải thích bất cứ điều gì.

$ echo "$FOO" 
This is line 1\nThis is line 2\nThis is line 3 
+0

Xin chào John, mã ví dụ của bạn phù hợp với tôi! Tuy nhiên, trong ví dụ đầu tiên ở trên, khi tôi lặp lại biến với '' 'echo $ FOO''' mà không đặt $ FOO giữa các dấu ngoặc kép, đầu ra nằm trên cùng một dòng. Bạn có biết tại sao? Tôi đang sử dụng GNU bash, phiên bản 4.3.11 (1) -release trên Ubuntu 14.04. – yaobin

+0

Đó là những gì sẽ xảy ra khi bạn không có dấu ngoặc kép. Giá trị là tùy thuộc vào * tách từ * và * mở rộng glob *. Thay vì 'echo' được yêu cầu in một đối số với các dòng mới được nhúng, mỗi từ' $ FOO' trở thành một đối số riêng biệt không có dòng mới. Nó giống như bạn viết 'echo Đây là dòng 1 Đây là dòng 2 Đây là dòng 3'. Điểm mấu chốt: luôn luôn mở rộng biến báo giá trừ khi bạn thực sự muốn nó phải chịu sự phân chia từ và globbing (hiếm). –

3

Khi bạn khởi tạo FOO, bạn nên sử dụng ngắt dòng: \n.

FOO="This is line 1\nThis is line 2\nThis is line 3" 

Sau đó, sử dụng echo -e để xuất FOO.

Điều quan trọng cần lưu ý là \n bên "..." KHÔNG phải là một ngắt dòng, nhưng theo nghĩa đen \, tiếp theo là đen n. Nó chỉ là khi được giải thích bởi echo -e rằng chuỗi chữ này được chuyển thành ký tự dòng mới. - Nói cách khôn ngoan từ mklement0


#!/bin/bash 

FOO="This is line 1\nThis is line 2\nThis is line 3" 
echo -e $FOO 

Output: 
This is line 1 
This is line 2 
This is line 3 
+0

nó ra cho là '-e Đây là dòng 1 Đây là dòng 2 Đây là dòng 3' – juned

+0

Cảm ơn. Nó làm việc cho tôi. – molecule

+2

@juned Bạn cần phiên bản 'echo' hỗ trợ' -e'. Lệnh echo tích hợp của Bash làm, cũng như nhị phân '/ bin/echo' của GNU. –

Các vấn đề liên quan