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

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

변수를 삽입하여 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>

답변1

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

이를 수행하는 간단하고 안전한 방법은 다음과 같이 작은따옴표로 묶인 문자열을 나누는 것입니다.

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")

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

~처럼@스틸드라이버주석에 적힌 대로 최신 버전의 bash에서는 다음과 같이 작성하여 하위 쉘을 피할 수 있습니다.

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

printf이는 쉘 내장이므로 이 대안은 아마도 맨 위의 첫 번째 제안의 일부일 것입니다 .

답변2

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

문자열에 큰따옴표를 사용하고 내부 큰따옴표를 이스케이프할 수 있습니다 \. 이와 같이:

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>

관련 정보