How to Fix “bash: !: event not found” Error When Using Exclamation Marks in Bash Shell


3 views

When you encounter the error -bash: !": event not found in your terminal, it's happening because bash interprets the exclamation mark (!) as a special character for history expansion. This is a feature that allows you to quickly recall and modify previous commands.

# This will fail with "event not found"
echo "Hello World!"

In bash, the exclamation mark triggers history expansion by default. When you use ! followed by text (like in !"), bash tries to find a matching command in your history, fails, and throws the error.

# Example of working history expansion
!ls  # Repeats last ls command

Here are several ways to properly include exclamation marks in your bash commands:

1. Single quotes (most reliable):

echo 'Reboot your instance!'

2. Disabling history expansion temporarily:

set +H
echo "Reboot your instance!"
set -H  # Re-enable history expansion

3. Escaping the exclamation mark:

echo "Reboot your instance\!"

4. Using printf instead of echo:

printf "%s\n" "Reboot your instance!"

History expansion can be powerful for command-line productivity. Some useful patterns:

!!      # Repeat last command
!-2     # Repeat command from 2 commands ago
!ssh    # Repeat last command starting with 'ssh'
^wrong^right  # Correct typo in last command

For scripts where you need consistent behavior, it's often best to disable history expansion at the start:

#!/bin/bash
set +H
# Your script code here

While this behavior exists in most bash versions (including your reported 4.1.5), some implementations might handle it slightly differently. The single-quote method remains the most portable solution across different Unix-like systems.


When you run commands like:

echo "Reboot your instance!"

Bash tries to interpret the exclamation mark (!) as a history expansion operator. This feature allows you to reference previous commands (like !$ for last argument or !! for previous command).

The error occurs because:

  • Bash's history expansion is enabled by default
  • It tries to interpret ! as the start of a history reference
  • When it can't find a matching event, it throws the "event not found" error

Here are several ways to properly handle exclamation marks:

1. Disable History Expansion Temporarily

set +H
echo "Reboot your instance!"
set -H  # re-enable afterwards if needed

2. Escape the Exclamation Mark

echo "Reboot your instance\!"

Or use single quotes (which prevent all expansions):

echo 'Reboot your instance!'

3. Disable History Expansion Permanently

Add this to your ~/.bashrc:

set +H

If you need history expansion but occasionally want literal !:

histchars=  # disable history expansion characters entirely
# or
histchars='^#' # change the expansion character to something else

Verify it works with:

echo "This works now! No more errors"
echo 'Single quotes work!'
echo "Escaped exclamation\! Mark"

This becomes crucial when:

  • Writing installation scripts that output messages
  • Generating configuration files with special characters
  • Processing user input that might contain !

Remember that different quoting styles in Bash have different expansion rules. Single quotes prevent all expansions, while double quotes allow some.