关于这篇文章如何在 bash 脚本中包含 python 脚本 ,我习惯了使用 python HereDoc。但是,我想将 python HereDoc 包含在 for 循环中,因此需要识别它,但 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,这就是为什么我需要 HereDoc 或任何其他方式在循环内使用 Python3。
答案1
您可以在其自己的 Bash 函数中使用本地第 1 列缩进来声明每个 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 )"
Here Document 要么完全被引用,要么完全不被引用(取决于 <<EOF 中的开始标记是否被引用)。如果不加引号,它将受到 shell 扩展的影响,并且容易受到传递文本中表示其他含义的字符的影响,除非每个出现的事件本身都被转义。
如果 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,未引用的部分可以包含任何 shell 构造,例如进程扩展,它可以调用任何其他函数或外部命令,以将文本注入 HereDoc。