EOF 후에 $id가 사라지는 이유는 무엇입니까?

EOF 후에 $id가 사라지는 이유는 무엇입니까?
cat >run_pos2bed3.sh <<EOF
ls 2*/peaks.txt | while read id;
do echo $id done;
EOF

입력 후

나노 전용 쇼

ls 2*/peaks.txt | while read id;
do echo  done;
EOF

$id나중에 어떻게 추가하나요 EOF?

답변1

그 이후에는 왜 $id사라졌나요 EOF?

<<왜냐하면, 와 를 말하면 $변수가 이미 가지고 있는 값을 얻게 되기 때문입니다. 당신이 그렇게한다면

id=foo
cat >run_pos2bed3.sh <<EOF
ls 2*/peaks.txt | while read id;
do echo $id done;
EOF

당신은 그것을 얻을 찾을 수 있습니다 do echo foo done.

$id나중에 어떻게 추가하나요 EOF?

하다

cat >run_pos2bed3.sh << \EOF
ls 2*/peaks.txt | while read id;
do echo $id done;
EOF

차이점은 온라인에 접속하기 전입니다 \.EOF<<

답변2

이 문서의 내용은 해당 문서를 참조하지 않는 한 확장(변수 및 명령 대체)될 수 있습니다. 귀하의 경우 여기 문서는 인용되지 않았기 때문에 $id확장되었습니다. 문서가 리디렉션되면 변수가 설정되지 않을 가능성이 높으므로 해당 값은 빈 문자열로 확장됩니다. 이렇게 하면 변수가 "사라지는" 것처럼 보입니다.

대신에:

cat >run_pos2bed3.sh <<'END_SCRIPT'
ls 2*/peaks.txt |
while read id; do
    echo "$id"
done
END_SCRIPT

또는 더 안전한 스크립트( id변수가 실제로 필요하지 않은 경우) 의 경우

cat >run_pos2bed3.sh <<'END_SCRIPT'
printf '%s\n' 2*/peaks.txt
END_SCRIPT

'END_SCRIPT'여기에 있는 문서를 인용하게 만드는 것은 내부의 작은따옴표입니다 ( "END_SCRIPT"또는 로 쓸 수도 있음 \END_SCRIPT).

$id또한 좋은 쉘 스크립팅 연습에 필요한 확장 기능을 문서 자체에서 참조했습니다(예:언제 큰따옴표가 필요합니까?).

관련 정보