변수를 삽입하여 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>
답변
큰 따옴표로 묶인 문자열에만 변수를 포함 할 수 있습니다.
이 작업을 수행하는 쉽고 안전한 방법은 다음과 같이 작은 따옴표로 묶은 문자열을 제거하는 것입니다.
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
쉘이 내장되어 있기 때문에이 대안은 아마도 맨 처음에 제안 할 부분 일 것입니다.
답변
작은 따옴표 문자열에서는 변수 확장이 발생하지 않습니다.
문자열에 큰 따옴표를 사용하고로 큰 따옴표를 이스케이프 처리 할 수 있습니다 \
. 이처럼 :
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>