Làm cách nào để chèn biến trong chuỗi chứa


25

Tôi muốn xây dựng một chuỗi xml bằng cách nhập các biến:

str1="Hello"
str2="world"

xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>'

echo $xml

Kết quả nên

<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>

Nhưng những gì tôi nhận được là:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>

Tôi cũng đã thử

xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"

Nhưng điều đó loại bỏ các trích dẫn kép bên trong và đưa ra:

<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>

2
Một tài liệu XML không thể có 2 thẻ cấp cao nhất. Ngoài ra, đó là năm 2016, tôi sẽ mạnh mẽ khuyên bạn sử dụng utf-8, không iso-8859-1.
Celada

Câu trả lời:


29

Bạn chỉ có thể nhúng các biến trong chuỗi trích dẫn kép.

Một cách dễ dàng và an toàn để thực hiện công việc này là thoát ra khỏi chuỗi trích dẫn đơn như thế này:

xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>'"$str1"'</tag1><tag2>'"$str2"'</tag2>'

Lưu ý rằng sau khi thoát ra khỏi chuỗi trích dẫn đơn, tôi đã đặt các biến trong dấu ngoặc kép. Điều này là để đảm bảo an toàn khi có các ký tự đặc biệt bên trong các biến.

Vì bạn đã hỏi một cách khác, đây là một cách thay thế kém hơn bằng cách sử dụng printf:

xml=$(printf '<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>' "$str1" "$str2")

Điều này là kém hơn bởi vì nó sử dụng một vỏ phụ để đạt được hiệu quả tương tự, đó là một quá trình bổ sung không cần thiết.

Như @steel ấn đã viết trong một bình luận, trong các phiên bản hiện đại của bash, bạn có thể viết như thế này để tránh lớp vỏ phụ:

printf -v xml ' ... ' "$str1" "$str2"

printflà một vỏ dựng sẵn, sự thay thế này có lẽ là một phần với đề xuất đầu tiên của tôi ở trên cùng.


7

Mở rộng biến không xảy ra trong chuỗi trích dẫn duy nhất.

Bạn có thể sử dụng dấu ngoặc kép cho chuỗi của mình và thoát dấu ngoặc kép bên trong bằng \ . Như thế này :

xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"

Kết quả đầu ra:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.