在 shell 脚本中循环 "heredoc"

Loop inside "heredoc" in shell scripting

我需要在具有参数化值的交互式 program/utility 中执行一系列命令。有没有办法在 heredoc 中循环?如下所示 .. 不确定 eval 在这里是否有任何帮助。下面的示例似乎不起作用,因为交互式似乎无法识别系统命令。

#!/bin/sh
list="OBJECT1 OBJECT2 OBJECT3"
utilityExecutable << EOF
for i in $list ; do
utilityCommand $i
done
EOF

而不是将 here-document 传递给 utilityExecutable, 等效于将所需的文本通过管道传递给它。您可以在 for 循环中使用 echo 语句创建所需的文本,并将整个循环输出通过管道传输到 utilityExecutable:

#!/bin/sh

list="OBJECT1 OBJECT2 OBJECT3"

for i in $list; do
    echo "utilityCommand $i"
done | utilityExecutable

是的,这很棘手,可能会造成混淆!您必须按如下方式修改代码。

#!/bin/sh
list="OBJECT1 OBJECT2 OBJECT3"
utilityExecutable << EOF
  list="$list"
  for i in $list ; do
    utilityCommand $i
  done
EOF

这是因为heredoc使用了自己的变量,完全独立于shell。当你在heredoc内部时,你必须使用和修改heredoc自己的变量。所以在 heredoc.

中需要 \$ 来引用 heredoc 自己的变量而不是 shell 变量
commandxyz -noenv<<EOF
echo "INFO - Inside eof" 
t_files=("${p_files[@]}")
#copy array
#echo ${t_files[*]} 
#all elements from array
#echo ${#t_files[@]}
#array length
for i in ${t_files[@]} ; do
        echo -e $i;
        do other stuff $i;
done
cat $patch_file
git apply $patch_file
EOF
cat << EOF
$(
    for i in {1..10}; do
        echo $i;
    done
)
EOF
myVar=$(
    for i in {1..5}; do
        echo hello;
        echo world;
    done;
); cat <<< $myVar