'EOF'를 사용하고 변수를 리터럴로 간주하는 bash 스크립트에 변수 전달

'EOF'를 사용하고 변수를 리터럴로 간주하는 bash 스크립트에 변수 전달

이 스크립트에서는 "$1"이 /test 파일에 저장됩니다.

#!/bin/bash
cat > /test << 'EOF'
$1
EOF

사실은.. 난 지켜야 해

'EOF'

내 인수($1)에 달러 기호가 포함되어 있으므로 'EOF'로 표시됩니다.

하지만 $1보다는 그 인수를 저장해야 합니다.

답변1

귀하의 후속 조치이전 질문, 당신이 원하는 것 같네요둘 다일부 해석되지 않은 텍스트와 일부 해석된 텍스트가 파일에 들어갑니다. 이 경우 두 가지 다른 cats(또는 echos)를 사용하십시오.

cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF

여기에는 몇 가지 일이 진행되고 있습니다. 첫째,heredoc. <<​위의 첫 번째 문자열처럼 해당 종결자 문자열에 따옴표를 포함하면 전체 heredoc이 해석되지 않습니다. 즉, 매개변수나 대체 항목이 없습니다. 만약 너라면~하지 않다다음과 같이 따옴표를 사용하세요.두번째 cat위에서와 같은 변수는 $1해당 값으로 대체되고 명령 대체는 텍스트에 포함됩니다. 대체를 원하는지 여부에 따라 "EOF" 문자열을 인용할지 여부를 선택합니다.

cat두 s를 우리가 사용하는 동일한 파일에 넣으려면>> 리디렉션두 번째(및 이후) ​​리디렉션의 경우: 이는 파일에 추가한다는 의미입니다. 첫 번째 경우에는 싱글을 사용하여 >파일을 지우고 새로 시작합니다.

참고하세요.변수가 대체됨, 해당 변수 값의 추가 달러 기호그렇지 않다스스로를 다시 대체했습니다.

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF

다음을 출력합니다:

$bar

의 가치를 대체하지 않고 $bar.

그러나 이 전체 스크립트의 인수에 "$"를 제공하는 경우 명령줄에서 이를 이스케이프하거나 전체를 작은따옴표로 묶어야 합니다. 대안적으로,명령 대체에서와 같이다른 질문파일 내용의 달러 기호를 포함하여 전체 파일의 내용을 직접 넣을 수 있습니다. 거기에 대체 문자열을 인용했는지 확인하세요.

oo.sh "$(cat myfile)"

필요에 따라 as myfile$1can 의 본문을 가져옵니다 . 에서와 동일한 제한 사항catecho내 대답은 거기에 있어적용: 명령줄 인수의 길이에는 제한이 있으며 파일이 그보다 길어질 수 있는 경우 다른 접근 방식을 찾아야 합니다. 다음을 통해 시스템의 한도를 확인할 수 있습니다.getconf ARG_MAX

답변2

단순히 하나의 변수를 파일로 출력하려는 ​​것 같습니다. 이 경우 다음이 작동합니다.

echo $1 >/test

이 파일은 /test일반 사용자가 일반적으로 쓰기 권한을 갖지 않는 루트 디렉터리에 있습니다.

편집: 달러 기호가 포함된 문자열을 인용해야 한다는 점을 명심하세요.명령줄에서. 여기서 대체가 발생하며 스크립트는 그 사실 이후에 이에 대해 아무 것도 할 수 없습니다.

관련 정보