Chcę utworzyć 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 powinno być
<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>
Ale otrzymuję:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>
Próbowałem też
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>
Komentarze
- Dokument XML nie może mieć 2 znaczników najwyższego poziomu. Ponadto ' w 2016 r. zdecydowanie zalecałbym używanie utf-8, a nie iso-8859-1.
Odpowiedź
Zmienne można osadzać tylko w łańcuchach umieszczonych w podwójnych cudzysłowach.
Łatwym i bezpiecznym sposobem na wykonanie tego zadania jest aby wyrwać się z pojedynczego cudzysłowu w ten sposób:
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>""$str1""</tag1><tag2>""$str2""</tag2>"
Zauważ, że po wyłamaniu ciągu z pojedynczym cudzysłowem umieściłem zmienne w cytaty. Ma to na celu zapewnienie bezpieczeństwa stosowania znaków specjalnych w zmiennych.
Ponieważ poprosiłeś o inny sposób, oto gorsza alternatywa, używając printf
:
xml=$(printf "<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>" "$str1" "$str2")
Jest to gorsze, ponieważ używa podpowłoki, aby osiągnąć ten sam efekt, co jest niepotrzebnym dodatkowym procesem.
Jak @steeldriver napisał w komentarzu, w nowoczesnych wersjach basha możesz napisać w ten sposób, aby uniknąć podpowłoki:
printf -v xml " ... " "$str1" "$str2"
Ponieważ printf
jest wbudowaną powłoką, ta alternatywa jest prawdopodobnie częścią mojej pierwszej sugestii u góry.
Odpowiedź
Interpretacja zmiennych nie występuje w ciągach pojedynczych cudzysłowów.
Możesz użyć podwójnych cudzysłowów dla swojego ciągu i pominąć podwójne cudzysłowy w środku z \
. W ten sposób:
xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Wynik wynikowy:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>