Chcę zbudować ciąg xml wstawiając zmienne:
str1="Hello"
str2="world"
xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>'
echo $xml
Wynik powinien być
<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>
Ale dostaję:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>
Też próbowałem
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Ale to usuwa wewnętrzne podwójne cudzysłowy i daje:
<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
Odpowiedzi:
Zmienne można osadzać tylko w ciągach cudzysłowów.
Łatwym i bezpiecznym sposobem na wykonanie tej pracy jest wyrwanie się z ciągu pojedynczego cudzysłowu:
Zauważ, że po wyrwaniu się z łańcucha pojedynczego cudzysłowu zawarłem zmienne w cudzysłowach. Ma to na celu bezpieczne umieszczanie znaków specjalnych w zmiennych.
Ponieważ poprosiłeś o inny sposób, oto gorsza alternatywa przy użyciu
printf
:Jest to gorsze, ponieważ wykorzystuje podpowłokę, aby osiągnąć ten sam efekt, co jest niepotrzebnym dodatkowym procesem.
Jak napisał @steeldriver w komentarzu, w nowoczesnych wersjach bash możesz pisać w ten sposób, aby uniknąć podpowłoki:
Ponieważ
printf
jest to wbudowana powłoka, ta alternatywa jest prawdopodobnie częściowo z moją pierwszą sugestią na górze.źródło
Zmienne rozwijanie nie występuje w ciągach pojedynczych cudzysłowów.
Możesz użyć podwójnych cudzysłowów dla swojego ciągu i uciec przed podwójnymi cudzysłowami za pomocą
\
. Lubię to :Wynikowy wynik:
źródło