Hogyan illesszünk be változókat a “ ” elemet tartalmazó karaktersorozatba?

Egy xml karakterláncot szeretnék létrehozni változók beillesztésével:

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

Az eredmény legyen

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

De amit kapok:

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

Én is kipróbáltam

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

Ez azonban eltávolítja a belső kettős idézőjeleket, és így ad:

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

Megjegyzések

  • Egy XML dokumentumnak nem lehet 2 legfelső szintű címkéje. Ezenkívül ' 2016-ban is, erősen javasoljuk az utf-8, nem pedig az iso-8859-1 használatát.

Válasz

A változókat csak dupla idézett karakterláncokba ágyazhatja be.

A munka egyszerű és biztonságos módja: hogy kitörjön az egyidéző karakterláncból, így:

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

Figyelje meg, hogy az egyszer idézett karakterláncból való kitörés után a változókat dupla idézetek. Ez biztonságossá teszi, hogy speciális karakterek legyenek a változókban.

Mivel más utat kért, itt egy alacsonyabbrendű alternatíva a printf használatával:

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

Ez alacsonyabb rendű, mert egy alhéj segítségével éri el ugyanazt a hatást, ami felesleges extra folyamat.

Mint @steeldriver kommentben írta, a bash modern verzióiban így írhat, hogy elkerülje az alhéjat:

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

Mivel a printf egy beépített shell, ezért valószínűleg ez az alternatíva az első javaslatommal a tetején található.

Válasz

A változó kiterjesztés nem történik meg egyetlen idézet karakterláncokban.

Használhat dupla idézőjeleket a karakterláncához, és elkerülheti a dupla idézőjeleket belül a következővel: \. Így:

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

Az eredmény kimenete:

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük