在 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
我需要在具有参数化值的交互式 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