Kevin
Kevin

Reputation: 183

Loop inside "heredoc" in shell scripting

I need to execute series of commands inside an interactive program/utility with parameterized values. Is there a way to loop inside heredoc ? Like below .. Not sure if eval can be of any help here. Below example doesn't seem to work as the interactive doesn't seem to recognize system commands.

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

Upvotes: 10

Views: 12044

Answers (5)

Raz Kheli
Raz Kheli

Reputation: 81

myVar=$(
    for i in {1..5}; do
        echo hello;
        echo world;
    done;
); cat <<< $myVar

Upvotes: 2

Raz Kheli
Raz Kheli

Reputation: 81

cat << EOF
$(
    for i in {1..10}; do
        echo $i;
    done
)
EOF

Upvotes: 5

Stupid_designer
Stupid_designer

Reputation: 128

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

Upvotes: 0

Kwan-yin Kong
Kwan-yin Kong

Reputation: 41

Yes, this is tricky and can be confusing! You have to modify your codes as follow.

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

This is because heredoc uses its own variables, which are completely separate from the shell. When you are inside heredoc, you have to use and modify heredoc's own variables. So the \$ is needed to reference heredoc's own variables instead of shell variables when inside heredoc.

Upvotes: 4

janos
janos

Reputation: 124646

Instead of passing a here-document to utilityExecutable, the equivalent is to pipe the required text to it. You can create the desired text using echo statements in a for-loop, and pipe the entire loop output to utilityExecutable:

#!/bin/sh

list="OBJECT1 OBJECT2 OBJECT3"

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

Upvotes: 7

Related Questions