"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이 해석되지 않습니다. 즉, 인수나 대체 항목이 없습니다. 만약 너라면아니요따옴표를 사용하세요.두번째 cat위에서 유사한 변수는 $1해당 값으로 대체되고 명령 대체가 텍스트에 포함됩니다. 교체가 필요한지 여부에 따라 "EOF" 문자열을 인용할지 여부를 선택할 수 있습니다.

cats를 우리가 사용하는 동일한 파일에 넣기>> 리디렉션두 번째(및 후속) 리디렉션의 경우: 이는 파일에 추가됨을 의미합니다. 첫 번째 작업에서는 단일 >일반 파일을 사용하고 다시 시작합니다.

그럴 때에도 참고해주세요변수가 대체됨, 변수 값의 다른 달러 기호아니요자신을 교체하십시오:

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

다음을 출력합니다:

$bar

$bar대체할 값이 없습니다 .

그러나 스크립트 전체에서 인수에 "$"를 제공하는 경우 명령줄에서 이를 이스케이프 처리하거나 전체를 작은따옴표로 묶어야 합니다. 또는,명령 대체좋다다른 질문파일 내용 내에 달러 기호를 포함하여 전체 파일의 내용을 직접 넣을 수 있습니다. 거기에서 대체 문자열을 인용하십시오.

oo.sh "$(cat myfile)"

myfileas의 본문을 얻은 $1다음 cat필요에 따라 이를 수행할 수 있습니다. echo와 동일한 제한 사항내 대답은 거기 있어적용: 명령줄 인수의 길이는 제한되어 있습니다. 파일이 이보다 길면 다른 방법을 찾아야 합니다. 다음 명령을 사용하여 시스템의 제한 사항을 확인할 수 있습니다.getconf ARG_MAX

답변2

변수를 파일로 출력하려는 ​​것 같습니다. 이 경우에는 다음과 같이 작동합니다.

echo $1 >/test

이는 /test루트 디렉터리에 있으며 일반 사용자는 일반적으로 쓰기 권한이 없습니다.

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

관련 정보