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にテキストを挿入できるプロセス拡張など、すべてのシェル構成を含めることができます。

関連情報