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