Как вставить переменные в строку, содержащую «»?

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>
Sidahmed
источник