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