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
자세한 내용은 참조하십시오 .