Bash Shell 루프에서 HereDoc을 호출하시나요?

Bash Shell 루프에서 HereDoc을 호출하시나요?

이 기사 정보Bash 스크립트에 Python 스크립트를 포함하는 방법 , 저는 Python HereDoc을 사용하는 데 익숙합니다. 그런데 for 루프에 Python HereDoc을 포함시키고 싶어서 인식해야 하는데 Visual Studio에서 파란색으로 표시된 첫 번째 HereDoc부터 시작해서 인식하지 못하는 것 같습니다. Python도 아직 작성되지 않았기 때문에 공백이지만,Bash Shell 루프 내에서 HereDoc을 호출하는 것이 가능한지 궁금합니다.

datarange=$(LC_ALL="POSIX" seq -f %.15g 0.5 0.25 5.5 | sed '/\./!s/$/.0/') 
for i in $datarange
do
    cp -r MovableFiles/mode-1 D$i
    cp -r MovableFiles/mode-4 D$i
    echo -n CWD:; /bin/pwd 
    cd $PBS_O_WORKDIR
    echo -n CWD:; /bin/pwd 
    cd D$i
    cd mode-1
    echo -n CWD:; /bin/pwd 
    # changes input files for mode-1
    python3 - << HERE



    HERE

    cd mode-4
    echo -n CWD:; /bin/pwd 
    # changes input files for mode-4
    python3 - << HERE




    HERE
done

내가 원하는 것은 "MovableFiles"의 입력 파일을 반복하여 D$i 디렉터리로 이동하고 특정 줄을 동적으로 변경하는 것입니다($i 번호와 관련하여). 하지만 Python3에서 텍스트를 변경하는 경향이 있습니다. 루프 내에서 Python3을 사용하려면 HereDoc 또는 다른 방법이 필요합니다.

답변1

로컬 열 1 들여쓰기를 사용하여 자체 Bash 함수 내에서 Python 코드의 각 블록을 선언합니다.

emitPy_Mode_4 () { cat <<'EOF'
Your python source
    goes here with
        any indentation you like
Just fine
EOF
}

다음과 같이 stdin을 통해 Bash 루프에서 호출할 수 있습니다.

emitPy_Mode_4 | python3 -

또는 여기에 문자열로 사용합니다. 예를 들면 다음과 같습니다.

python3 - <<<"$( emitPy_Mode_4 )"

여기서 Document는 완전히 참조되거나 전혀 참조되지 않습니다(<<EOF의 여는 태그가 참조되는지 여부에 따라 다름). 인용되지 않은 경우 쉘 확장이 적용되며 각 항목 자체가 이스케이프되지 않는 한 전달된 텍스트에서 다른 의미를 갖는 문자에 취약합니다.

HereDoc이 함수 내에 포함된 경우 제어 확장을 위해 서로 다른 참조를 사용하여 부분으로 분할될 수 있습니다. 필요한 변수를 함수에 전달할 수 있습니다.

emitPy_Mode_4 () {  #.. Takes one filename argument.
cat <<'EOF'    #.. Preamble
Your python source
EOF
cat <<EOF      #.. Inject variable.
    myPathName = '${1}'
EOF
cat <<'EOF'    #.. Remainder.
    goes here with
        any indentation you like
Just fine
EOF
}

IIRC에서 인용되지 않은 섹션에는 다른 함수나 외부 명령을 호출하여 HereDoc에 텍스트를 삽입할 수 있는 프로세스 확장과 같은 모든 셸 구성이 포함될 수 있습니다.

관련 정보