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