วิธีการแทรกตัวแปรภายในสตริงที่มี“”?


25

ฉันต้องการสร้างสตริง xml โดยการแทรกตัวแปร:

str1="Hello"
str2="world"

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

echo $xml

ผลลัพธ์ที่ควรจะเป็น

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

แต่สิ่งที่ฉันได้คือ:

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

ฉันก็ลอง

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

แต่จะลบเครื่องหมายคำพูดคู่ด้านในและให้

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

2
เอกสาร XML ไม่สามารถมีแท็กระดับบนสุดได้ 2 แท็ก นอกจากนี้ในปี 2559 ฉันขอแนะนำให้ใช้ utf-8 ไม่ใช่ iso-8859-1
Celada

คำตอบ:


29

คุณสามารถฝังตัวแปรในสตริงที่มีเครื่องหมายคำพูดคู่เท่านั้น

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

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

โปรดสังเกตว่าหลังจากแยกสตริงที่มีเครื่องหมายคำพูดเดี่ยวฉันจะใส่ตัวแปรภายในเครื่องหมายคำพูดคู่ นี่คือเพื่อให้ปลอดภัยที่จะมีอักขระพิเศษภายในตัวแปร

เมื่อคุณถามหาวิธีอื่นนี่เป็นทางเลือกที่ด้อยกว่าเมื่อใช้printf:

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

สิ่งนี้ด้อยกว่าเพราะใช้ sub-shell เพื่อให้ได้เอฟเฟกต์เดียวกันซึ่งเป็นกระบวนการพิเศษที่ไม่จำเป็น

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

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

เนื่องจากprintfเป็น shell builtin ตัวเลือกนี้น่าจะเป็นส่วนหนึ่งของคำแนะนำแรกของฉันที่ด้านบน


7

การขยายตัวของตัวแปรไม่ได้เกิดขึ้นในสตริงคำพูดเดี่ยว

\คุณสามารถใช้คำพูดสองสตริงของคุณและหลบหนีราคาคู่ภายในด้วย อย่างนี้ :

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

ผลลัพธ์ที่ได้:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.