![한 변수는 확장하지만 다른 변수는 확장하지 않는 파일 만들기](https://linux55.com/image/13083/%ED%95%9C%20%EB%B3%80%EC%88%98%EB%8A%94%20%ED%99%95%EC%9E%A5%ED%95%98%EC%A7%80%EB%A7%8C%20%EB%8B%A4%EB%A5%B8%20%EB%B3%80%EC%88%98%EB%8A%94%20%ED%99%95%EC%9E%A5%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%ED%8C%8C%EC%9D%BC%20%EB%A7%8C%EB%93%A4%EA%B8%B0.png)
Bash 스크립트에서 파일을 만들고 싶습니다. 하지만 일부 변수를 확장하고 다른 변수를 문자 그대로 인쇄해야 하는데 이것이 가능합니까?
cat <<EOF > file.sh
$EXPAND
$PRINTLITERALLY
EOF
또한 매우 큰 파일을 생성하려고 하는데 테스트를 위해 터미널에 붙여넣으려고 하면 다음과 같은 오류가 발생합니다.
-bash: urlencode: command not found
그러면 bash가 해석하는 내용이 있는 것 같습니다. 이것이 내 bash 스크립트 런타임에 영향을 줍니까? 내 bash 스크립트에서 파일을 생성하는 더 좋은 방법이 있어야 한다고 생각합니다.
답변1
EXPAND=value
cat <<EOF > file.sh
$EXPAND
\$PRINTLITERALLY
EOF
file.sh
으로 생성됩니다
value
$PRINTLITERALLY
콘텐츠로.
(매번 발생하거나 $
해당 `
매개변수 확장, 산술 확장 또는 명령 대체를 확장하지 않으려는 곳에 백슬래시를 추가해야 합니다. 또한 일부 백슬래시 문자를 이스케이프해야 합니다.)
또 다른 방법:
cat - << EXPANDED /dev/fd/3 3<< 'NOT-EXPANDED' /dev/fd/4 4<< EXPANDED-AGAIN > file.sh
$EXPAND
`echo test`
...
EXPANDED
$PRINTLITERALLY
`echo test`
...
NOT-EXPANDED
$EXPAND
...
EXPANDED-AGAIN
여기서 구분 기호를 참조하는 문서(위에 표시 3<< 'NOT-EXPANDED'
)는 셸 확장을 수행하지 않으므로 수행할 작업과 수행하지 않을 작업을 결정할 수 있습니다.
위와 같이 하면 다음을 얻을 수 있습니다.
value
test
...
$PRINTLITERALLY
`echo test`
...
value
...
다른 모든 매개변수 확장, 명령 대체, 산술 확장은 확장하지 않고 그대로 두고 특정 변수 집합만 확장하려는 경우 envsubst
GNU와 함께 제공되는 유틸리티를 사용할 수 있습니다 gettext
.
그러나 이는 합계만 확장하고 $var
변수 (예: , ...) 와 ${var}
관련된 다른 형태의 인수 확장은 확장하지 않는다는 점에 유의하세요.$var
${var#?}
${var[x]}
EXPAND=value EXPAND_AS_WELL=othervalue
export EXPAND EXPAND_AS_WELL
envsubst '$EXPAND$EXPAND_AS_WELL' << '__end_of_envsubst__' > file.sh
$EXPAND ${EXPAND} ${EXPAND#?} ${EXPAND[0]} $EXPAND[0] $EXPANDÉ \$EXPAND
$PRINTLITERALLY $EXPAND_AS_WELL
`echo test`
__end_of_envsubst__
다음을 제공합니다:
value value ${EXPAND#?} ${EXPAND[0]} value[0] valueÉ \value
$PRINTLITERALLY othervalue
`echo test`
info gettext envsubst
자세한 내용은 참조하십시오 .