내 프로젝트의 경우 템플릿 파일을 기반으로 일부 파일을 생성하는 방법이 필요합니다. 제가 상상하는 것은 이렇습니다.
템플릿 파일에는
{{var1}}
대체할 변수와 유사한 데이터가 포함되어 있습니다.key = value
다른 파일에는 값 목록이 포함되어 있습니다.도구를 적용한 후 특정 값을 포함하는 새 파일이 생성되어야 합니다.
두 번째 파일 대신 명령줄을 통해 쌍 목록이 제공될 수도 있고 key = value
, 마찬가지로 일부 키에는 두 번째 파일의 키 값이 아닌 환경 변수가 필요할 수도 있습니다.
어디표준 및 잘 알려진 유틸리티Linux/Unix 세계에서 이것이 가능합니까?
답변1
이런 스크립트를 작성하는 것은 정말 쉽습니다. 예를 들어 다음을 수행할 수 있습니다.원천한 쌍의 파일을 만든 key=value
다음 이를 사용하여 템플릿의 내용을 바꿉니다. 예를 들어:
$ cat template
Hello $name,
someone told me you really like $thing!
$ cat values
name=Bob
thing=chocolate
그러면 스크립트는 다음과 같습니다.
#!/bin/sh
## source the key/value pairs
. "$1"
## Replace them in the template
sed -e "s/\\\$name/$name/g" -e "s/\\\$thing/$thing/g" "$2"
다음과 같이 실행합니다.
$ foo.sh /full/path/to/values template
Hello Bob,
someone told me you really like chocolate!
물론 이를 위해서는 키 이름을 미리 알아야 합니다. 또 다른 옵션은 다음과 같습니다.
#!/bin/sh
tmpFile=$(mktemp)
cp -- "$2" "$tmpFile"
while IFS='=' read -r key value; do
sed -i -e "s/\$$key/$value/g" "$tmpFile"
done < "$1"
cat "$tmpFile"
eval
또 다른 옵션은 확장 변수를 사용하는 것입니다 . 하지만 이는 파일의 값이 잠재적으로 위험한 경우 코드 삽입의 위험이 있으므로 위험합니다. 이것이 문제가 되지 않는다면 다음을 시도해 보세요.
#!/bin/sh
## source the key/value pairs
. "$1"
## load the contents of the template
template="$(cat "$2")"
## Now print, but expanding the variables. We need to
## unset IFS to protect the newlines.
IFS=
eval echo \"$template\"