“”가 포함 된 문자열 안에 변수를 삽입하는 방법은 무엇입니까?


25

변수를 삽입하여 xml 문자열을 구성하고 싶습니다.

str1="Hello"
str2="world"

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

echo $xml

결과는

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

그러나 내가 얻는 것은 :

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

나는 또한 시도했다

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

그러나 내부 큰 따옴표를 제거하고 다음을 제공합니다.

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

2
XML 문서는 2 개의 최상위 태그를 가질 수 없습니다. 또한 2016 년이므로 iso-8859-1이 아닌 utf-8을 사용 하는 것이 좋습니다.
Celada

답변:


29

큰 따옴표로 묶인 문자열에만 변수를 포함 할 수 있습니다.

이 작업을 수행하는 쉽고 안전한 방법은 다음과 같이 작은 따옴표로 묶은 문자열을 제거하는 것입니다.

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

작은 따옴표로 묶인 문자열을 제거한 후 변수를 큰 따옴표로 묶었습니다. 이것은 변수 안에 특수 문자를 포함하는 것이 안전하도록하기위한 것입니다.

다른 방법을 요청 했으므로 다음을 사용하는 열등한 대안이 있습니다 printf.

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

서브 쉘을 사용하여 동일한 효과를 얻기 때문에 이는 열등합니다. 이는 불필요한 추가 프로세스입니다.

으로 @steeldriver이 코멘트에 쓴, 배쉬의 현대 버전에서, 당신은 서브 쉘을 방지하기 위해 다음과 같이 쓸 수 있습니다 :

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

printf쉘이 내장되어 있기 때문에이 대안은 아마도 맨 처음에 제안 할 부분 일 것입니다.


7

작은 따옴표 문자열에서는 변수 확장이 발생하지 않습니다.

문자열에 큰 따옴표를 사용하고로 큰 따옴표를 이스케이프 처리 할 수 ​​있습니다 \. 이처럼 :

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

결과 출력 :

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.