Hoe voeg ik variabelen in een string in die “ ” bevat?

Ik wil een xml-string maken door variabelen in te voegen:

str1="Hello" str2="world" xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" echo $xml 

Het resultaat zou moeten zijn

<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2> 

Maar wat ik krijg is:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2> 

Ik heb ook geprobeerd

xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" 

Maar dat verwijdert de binnenste dubbele aanhalingstekens en geeft:

<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2> 

Reacties

  • Een XML-document mag niet twee tags op het hoogste niveau hebben. Ook, het ' s 2016, zou ik sterk aanraden utf-8 te gebruiken, niet iso-8859-1.

Answer

U kunt variabelen alleen insluiten in strings met dubbele aanhalingstekens.

Een gemakkelijke en veilige manier om dit te laten werken is om als volgt uit de string met enkele aanhalingstekens te breken:

xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>""$str1""</tag1><tag2>""$str2""</tag2>" 

Merk op dat na het doorbreken van de string tussen enkele aanhalingstekens, ik de variabelen tussen dubbele citaten. Dit is om het veilig te maken om speciale tekens in de variabelen te hebben.

Aangezien je om een andere manier vroeg, is hier een inferieur alternatief met printf:

xml=$(printf "<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>" "$str1" "$str2") 

Dit is inferieur omdat het een sub-shell gebruikt om hetzelfde effect te bereiken, wat een onnodig extra proces is.

Als @steeldriver schreef in een opmerking, in moderne versies van bash kun je zo schrijven om de subshell te vermijden:

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

Aangezien printf een ingebouwde shell is, is dit alternatief waarschijnlijk gedeeltelijk met mijn eerste suggestie bovenaan.

Antwoord

Variabele uitbreiding gebeurt niet in enkele aanhalingstekens.

U kunt dubbele aanhalingstekens gebruiken voor uw tekenreeks en ontsnappen aan de dubbele aanhalingstekens erin met \. Zoals dit:

xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>" 

De resultaatuitvoer:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2> 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *