cat - 파일을 리디렉션하지만 변수 확장이 포함됩니다.

cat - 파일을 리디렉션하지만 변수 확장이 포함됩니다.

~/nginx_app다음 conf 템플릿이 포함된 파일이 있습니다.

server {
    root /var/www/html/${domain}/;
    server_name ${domain} www.${domain};
}

이 스크립트도 있습니다.

#!/bin/bash
domain="$1" && test -z ${domain} && return
cat ~/myAddons/nginx_app > /etc/sites-available/${domain}.conf

보시다시피 스크립트로 생성된 콘텐츠를 리디렉션하고 싶습니다 nginx_app.${domain}.conf

cat이제 리디렉션이 발생할 때 템플릿 내부의 변수를 확장해야 합니다. 확장이 실제로 발생한다는 것을 어떻게 보장합니까?

here-string에 대해 생각하고 있었지만 문자열을 인쇄한다는 것을 알고 있습니다.

cat > "etc/nginx/sites-available/${domain}.conf" <<< "source ~/myAddons/nginx_app"

cat ~/myAddons/nginx_app > etc/nginx/sites-available/${domain}.conf

고쳐 쓰다

스크립트를 실행한 후 최종 상태는 다음과 같아야 합니다 /etc/sites-available/example.com.conf.

server {
    root /var/www/html/example.com/;
    server_name example.com www.example.com;
}

답변1

당신이 원하는 것은 기본적으로 변수 확장이 아닌 입력 파일의 내용을 처리하는 문자열 대체입니다(비록 쉘은 변수를 인용할 때 그렇게 하지만 입력 내용에는 작동하지 않습니다).

이는 sed쉘 변수를 사용하여 수행할 수 있습니다.이것발생할 수 있는 모든 질문에 답하십시오.

#!/bin/sh
test -n "$1" || exit 1
sed 's/\${domain}/'"$1"'/g' input.txt > output_"$1".txt

input그에 따라 조정하십시오 output. 또한 $1위치 매개변수를 변수에 복사하는 대신 직접 사용하고 있다는 점에 유의하세요.

제가 제안할 수 있는 더 나은 접근 방식은 템플릿 역할을 하는 스크립트를 갖고 스크립트 명령줄에서 위치 인수로 변수를 제공하거나 변수 파일을 가져오는 것입니다. 특히 패턴이 복잡해지면 파일을 복사하고 문자열을 교체하여 곡예를 수행하는 것은 최선의 방법이 아닙니다.

답변2

내가 한 일은 (StephenHarris의 의견에서 편집됨) 다음과 같습니다.

domain=aa ; sed s"/\$domain/$domain/" ~/nginx_app >> ${domain}.conf

$domainsed 명령의 두 번째 확장은 aa내 테스트 사례에 적용됩니다. 그러나 첫 번째 식별자 $domain$이스케이프되므로 확장되지 않습니다.

awk변수를 외부에서 내부로 전달하는 더 강력한 방법이 있지만 더 빠르고 효율적인 것으로 간주되는 또 다른 명령줄 프로그램이 있습니다 sed(지금은 실제로 그런지 확실하지 않음). 그래서 나는 이유라고 대답했습니다 sed. 간단한 경우이다. 에서는 awk다음을 사용할 수 있습니다.

awk -v domain=aa '{gsub("\\$domain",domain);print}' ~/nginx_app >> ${domain}.conf

여기서 -v옵션은 변수를 awk정의하며 awk, 주어진 라인에서 전역 교체를 수행하는 함수 gsub입니다 . awk이스케이프 시퀀스 는 솔루션 \\보다 약간 깁니다.sed

관련 정보