Test your shell scripts

This package provides a command for testing your shell scripts.

Using shpec

shpec’s repo itself is using shpec, so feel free to use it as an example.

Here is the basic structure that you’ll want:

└── shpec

Then to run your tests:

shpec [shpec_files]

If you’d like your tests to run automatically when they change, we recommend the entr utility:

find . -name "*" | entr shpec


shpec’s own tests are a great place to start. For more examples, see the wiki page


The general format is:

assert matcher arguments

where matcher is one of the following:

Binary Matchers

equal         # equality
unequal       # inequality
gt            # algebraic '>'
lt            # algebraic '<'
match         # regex match
no_match      # lack of regex match

Unary Matchers

present       # string presence
blank         # string absence
file_present  # file presence
file_absent   # file absence
symlink       # tests a symlink's target
test          # evaluates a test string

Custom Matchers

Custom matchers are loaded from shpec/matchers/*.sh.

For example, here’s how you’d create a still_alive matcher:

# in shpec/matchers/
still_alive() {
  ping -oc1 "$1" > /dev/null 2>&1
  assert equal "$?" 0

Then you can use that matcher like any other:

# in shpec/
describe "my server"
  it "serves responses"
    assert still_alive ""


You can either install with bpkg

$ bpkg install rylnd/shpec

or with curl

sh -c "`curl -L`"

or with antigen for zsh by putting antigen bundle rylnd/shpec in your .zshrc

Published: May 05 2015

blog comments powered by Disqus