Bird
Raised Fist0
Bash Scriptingscripting~10 mins

Here documents (<<EOF) in Bash Scripting - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Here documents (<<EOF)
Start script
↓
Encounter <<EOF
↓
Read lines until EOF
↓
Pass lines as input
↓
Command executes with input
↓
Script continues or ends
The script reads lines after <<EOF until it finds EOF, then sends those lines as input to a command.
Execution Sample
Bash Scripting
cat <<EOF
Hello
World
EOF
This script sends the lines 'Hello' and 'World' as input to the cat command, which prints them.
Execution Table
StepActionInput ReadCommand InputOutput
1Start script
2Encounter <<EOF
3Read lineHello
4Read lineWorld
5Read lineEOF
6Pass lines to catHello\nWorldHello\nWorld
7cat prints inputHello World
8Script ends
💡 Reached EOF marker, input passed to command, script ends
Variable Tracker
VariableStartAfter Step 3After Step 4After Step 5Final
input_linesemptyHelloHello\nWorldHello\nWorldHello\nWorld
Key Moments - 3 Insights
Why does the script stop reading input after the EOF line?
Because the EOF marker tells the shell where the here document ends, as shown in execution_table step 5.
Are the lines inside the here document treated as commands?
No, they are treated as plain text input passed to the command before <<EOF, as seen in step 6.
What happens if the EOF marker is missing?
The shell waits indefinitely for the EOF marker, causing the script to hang, since it doesn't know where input ends.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the command input at step 6?
A"Hello\nWorld"
B"Hello"
C"World"
D"EOF"
💡 Hint
Check the 'Command Input' column at step 6 in the execution_table.
At which step does the script stop reading lines for the here document?
AStep 3
BStep 5
CStep 4
DStep 6
💡 Hint
Look at the 'Input Read' column to find when EOF is read in the execution_table.
If the EOF marker was changed to END, what would change in the execution table?
AThe output would be empty
BStep 6 would have no input
CStep 5 would read 'END' instead of 'EOF'
DThe script would end earlier
💡 Hint
The EOF marker defines the end line, so changing it changes the line read at step 5.
Concept Snapshot
Here documents (<<EOF) let you send multiple lines of text as input to a command.
Syntax: command <<EOF ... EOF
The shell reads lines until it finds EOF, then passes them to the command.
Useful for feeding scripts or commands with fixed input.
EOF marker can be any word but must match exactly.
Lines inside are treated as plain text, not commands.
Full Transcript
Here documents in bash scripting allow you to send multiple lines of text as input to a command. When the shell sees <<EOF, it starts reading the following lines until it finds a line with only EOF. These lines are then passed as input to the command before <<EOF. For example, 'cat <<EOF' followed by lines 'Hello' and 'World' and then 'EOF' will send 'Hello\nWorld' to cat, which prints them. The script stops reading input when it finds the EOF marker. If the EOF marker is missing, the shell waits forever. The lines inside the here document are not commands but plain text. You can change EOF to any word, but it must match exactly to end the input.

Practice

(1/5)
1. What is the main purpose of using a here document (<
easy
A. To provide multiple lines of input or text to a command easily
B. To create a new file automatically
C. To run commands in the background
D. To define a function in the script

Solution

  1. Step 1: Understand the here document concept

    A here document lets you send multiple lines of text or commands as input to a command in a script.
  2. Step 2: Identify the correct purpose

    It is not for creating files, running background commands, or defining functions, but for providing multiline input.
  3. Final Answer:

    To provide multiple lines of input or text to a command easily -> Option A
  4. Quick Check:

    Here document = multiline input [OK]
Hint: Here documents send blocks of text to commands [OK]
Common Mistakes:
  • Thinking it creates files automatically
  • Confusing with background job control
  • Assuming it defines functions
2. Which of the following is the correct syntax to start a here document in bash?
easy
A. command <
B. <
C. command EOF<<
D. << command EOF

Solution

  1. Step 1: Recall the here document syntax

    The correct syntax places the command first, then <
  2. Step 2: Match the options

    Only command <
  3. Final Answer:

    command < -> Option A
  4. Quick Check:

    Command before <
Hint: Command comes before <
Common Mistakes:
  • Putting <
  • Swapping EOF and <<
  • Adding spaces incorrectly
3. What will be the output of this script?
cat <
medium
A. Hello $USER
B. Hello (your username)
C. Syntax error
D. Hello EOF

Solution

  1. Step 1: Understand variable expansion in here documents

    Without quotes around EOF, variables like $USER are expanded to their values.
  2. Step 2: Predict the output

    The script prints Hello followed by your actual username, not the literal $USER.
  3. Final Answer:

    Hello (your username) -> Option B
  4. Quick Check:

    Unquoted EOF expands variables [OK]
Hint: Unquoted EOF expands variables inside [OK]
Common Mistakes:
  • Expecting $USER to print literally
  • Thinking it causes syntax error
  • Confusing EOF marker as output
4. Identify the error in this script snippet:
cat <<'EOF'
Hello $USER
EOF
medium
A. The EOF marker should not be quoted
B. EOF must be uppercase
C. Missing semicolon after <<'EOF'
D. Variables inside quoted EOF are not expanded, so $USER prints literally

Solution

  1. Step 1: Understand quoting effect on here documents

    Quoting the EOF marker disables variable expansion inside the here document.
  2. Step 2: Identify the output behavior

    Because of quotes, $USER prints literally, which may be unexpected.
  3. Final Answer:

    Variables inside quoted EOF are not expanded, so $USER prints literally -> Option D
  4. Quick Check:

    Quoted EOF disables variable expansion [OK]
Hint: Quoted EOF means no variable expansion [OK]
Common Mistakes:
  • Thinking quotes cause syntax error
  • Expecting variables to expand inside quoted EOF
  • Believing EOF must be uppercase
5. You want to create a script that sends this exact text to a file, including the literal string $PATH:
Path is: $PATH

Which here document syntax should you use?
hard
A. cat <<"EOF" > file.txt Path is: $PATH EOF
B. cat < file.txt Path is: $PATH EOF
C. cat <<'EOF' > file.txt Path is: $PATH EOF
D. cat < file.txt Path is: \$PATH EOF

Solution

  1. Step 1: Understand how to prevent variable expansion

    To keep $PATH literal, quote the EOF marker to disable expansion.
  2. Step 2: Choose the correct syntax

    Using <<'EOF' prevents $PATH from expanding, so the exact text is written.
  3. Final Answer:

    cat <<'EOF' > file.txt Path is: $PATH EOF -> Option C
  4. Quick Check:

    Quote EOF to keep variables literal [OK]
Hint: Quote EOF to keep variables literal in output [OK]
Common Mistakes:
  • Not quoting EOF and expecting literal $PATH
  • Using escape \$PATH inside unquoted EOF
  • Using double quotes which still expand variables
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard