코드가 포함 된 파일을 << EOF >> 분류하는 방법은 무엇입니까? $curr -lt

다음을 사용하여 코드를 파일로 인쇄하고 싶습니다 cat <<EOF >>.

cat <<EOF >> brightup.sh
!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
   curr=$((curr+406));
   echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi
EOF

하지만 파일 출력을 확인하면 다음과 같이 표시됩니다.

!/bin/bash
curr=1634
if [  -lt 4477 ]; then
   curr=406;
   echo   > /sys/class/backlight/intel_backlight/brightness;
fi

나는 작은 따옴표를 넣어 보았지만 출력에는 작은 따옴표도 포함되어 있습니다. 이 문제를 어떻게 피할 수 있습니까?



답변

최소한의 변경 만 필요합니다. 여기서 문서 구분 기호를 작은 따옴표로 묶으십시오 <<.

cat <<'EOF' >> brightup.sh

또는 동등하게 백 슬래시 이스케이프 :

cat <<\EOF >>brightup.sh

인용하지 않으면 here 문서는 변수 대체를 거치고 백틱이 평가됩니다.

전부가 아닌 일부 값을 확장해야하는 경우 방지하려는 값을 개별적으로 이스케이프해야합니다.

cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF

생산할 것이다

#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"

@fedorqui가 제안한대로 다음은 관련 섹션입니다 man bash.

여기 문서

이러한 유형의 재 지정은 구분 기호 만 포함 된 행 (후행 공백 없음)이 표시 될 때까지 현재 소스에서 입력을 읽도록 쉘에 지시합니다. 그 지점까지 읽은 모든 행은 명령의 표준 입력으로 사용됩니다.

여기 문서의 형식은 다음과 같습니다.

      <<[-]word
              here-document
      delimiter

매개 변수 확장, 명령 대체, 산술 확장 또는 경로 이름 확장은 단어에서 수행되지 않습니다. 단어의 문자가 인용 된 경우 구분 기호는 단어에서 인용 부호를 제거한 결과이며 여기 문서의 행은 확장되지 않습니다. 단어가 인용되지 않으면 here-document의 모든 행은 매개 변수 확장, 명령 대체 및 산술 확장의 대상이 됩니다. 후자의 경우 문자 시퀀스 \는 무시되며 \, $ 및`문자를 인용하는 데 \를 사용해야합니다.


답변

또는 EOF 마커를 사용하여 확장이 수행되지 않도록 초기 마커를 인용해야합니다.

#-----v---v------
cat <<'EOF' >> brightup.sh
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
   curr=$((curr+406));
   echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi
EOF

IHTH


답변

이것은 작동해야합니다. 방금 테스트했고 예상대로 작동했습니다. 확장, 대체 또는 수행 한 작업이 없습니다.

cat <<< '
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
  curr=$((curr+406));
  echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want. 

다음을 사용하는 것도 작동합니다.

cat <<< ' > file
 ... code ...'

또한, << EOF대체 및 변수 확장 등과 같은 heredocs를 사용할 때 발생한다는 점에 주목할 가치가 있습니다. 그래서 다음과 같이합니다.

cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF

항상 변수 $HOME$PWD. 따라서 홈 디렉토리가 /home/foobar이고 현재 경로가 /home/foobar/bin이면 file다음과 같습니다.

cd "/home/foobar"
echo "/home/foobar/bin"

예상 대신 :

cd "$HOME"
echo "$PWD"

답변

나는 이것이 2 년 된 질문이라는 것을 알고 있지만 이것은 ‘방법’을 검색하는 사람들을위한 빠른 대답입니다.

어떤 것에도 따옴표를 붙이고 싶지 않다면 파일에 텍스트 블록을 작성하고 텍스트로 내보낼 변수 (예 : 스크립트에서 사용)를 이스케이프하고 원하는 변수를 이스케이프하지 마십시오. 변수 값으로 내 보냅니다.

#!/bin/bash

FILE_NAME="test.txt"
VAR_EXAMPLE="\"string\""

cat > ${FILE_NAME} << EOF
\${VAR_EXAMPLE}=${VAR_EXAMPLE} in ${FILE_NAME}
EOF

“$ {VAR_EXAMPLE} =”string “in test.txt”를 test.txt에 기록합니다.

파일 이름을 생략하여 동일한 규칙으로 콘솔에 텍스트 블록을 출력하는데도 사용할 수 있습니다.

#!/bin/bash

VAR_EXAMPLE="\"string\""

cat << EOF
\${VAR_EXAMPLE}=${VAR_EXAMPLE} to console
EOF

콘솔에 “$ {VAR_EXAMPLE} =”string “to console”을 출력합니다.