Як вставити змінні всередині рядка, що містить ""?


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 теги верхнього рівня. Крім того, це 2016 рік, я настійно рекомендую використовувати utf-8, а не iso-8859-1.
Селада

Відповіді:


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")

Це неповноцінне, оскільки для досягнення такого ж ефекту використовує підрозділ, що є зайвим додатковим процесом.

Як @steeldriver писав у коментарі, в сучасних версіях bash, ви можете написати так, щоб уникнути нижньої оболонки:

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

Оскільки printfце вбудована оболонка, ця альтернатива, мабуть, є частково моєю першою пропозицією вгорі.


8

Змінне розширення не відбувається в одних рядках цитат.

Ви можете використовувати подвійні лапки для рядка та уникати подвійних лапок всередині \. Подобається це :

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.