在 Bash Shell 循环中调用 HereDoc?

在 Bash Shell 循环中调用 HereDoc?

关于这篇文章如何在 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。

相关内容