Jak wstawić zmienne do ciągu zawierającego “ ”?

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> 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *