DEV Community

A Soft Introduction to EasyShell

"Can it be simpler?" - A recurring thought I've had while working on build automation.

EasyShell (command: easy) is a minimal shell scripting language designed from the ground up for simplicity and cross-platform build/process automation. If you’ve ever felt that PowerShell’s syntax is powerful but easy to forget, or that traditional shell scripts get messy across operating systems, EasyShell aims to strike a cleaner balance.

It's implemented in C# and runs on .NET, giving you natural access to the entire .NET ecosystem while keeping the scripting experience lightweight and approachable.

Design Principles

  • One command per line (shell-like flow)
  • Very small set of core concepts
  • Strongly-typed global variables
  • Seamless .NET interop via reflection
  • Expressions in parentheses for inline evaluation
  • Easy to read, write, and remember

Version 0.1.0 is now available — functional for everyday automation tasks.

Core Language Features

Variables

All variables are declared with an explicit type and live in global scope:

INTVAR Count 42
BOOLVAR Debug TRUE
DOUBLEVAR Ratio 3.14
STRINGVAR Message "Hello from EasyShell"
HANDLEVAR Now System.DateTime.Now   # stores object instances
Enter fullscreen mode Exit fullscreen mode
  • Variable names are case-insensitive
  • Reference with $VarName
  • Re-assign with $VarName = value (or expressions)

Expressions (The Power Feature)

Wrap sub-commands in parentheses to evaluate them inline:

STRINGVAR Formatted (System.String.Format "Count = {0}" $Count)
BOOLVAR IsBig (> $Count 100)
STRINGVAR Today (format "{0:yyyy-MM-dd}" (GetDate))
Enter fullscreen mode Exit fullscreen mode

Calling .NET

  • Static members (fully qualified):
  System.Console.WriteLine "Hello World!"
  System.IO.File.WriteAllText "output.txt" $Message
Enter fullscreen mode Exit fullscreen mode
  • Instance methods via HANDLE:
  HANDLEVAR Now System.DateTime.Now
  STRINGVAR Stamp (CALL $Now ToString)
Enter fullscreen mode Exit fullscreen mode

Control Flow

IF (== $Count 42)
    print "The answer!"
ELSEIF (> $Count 50)
    print "Too high"
ELSE
    print "Something else"
END

INTVAR I 0
WHILE (< $I 5)
    System.Console.WriteLine $I
    $I = (+ $I 1)   # arithmetic helpers coming soon
END
Enter fullscreen mode Exit fullscreen mode

Functions

Simple named blocks (no parameters — use globals):

FUNC BuildProject
    print "Building..."
    dotnet build
END

CALL BuildProject
Enter fullscreen mode Exit fullscreen mode

External Commands

Any command that isn’t a keyword or .NET call falls back to executing an external process (with stdout capture):

git status
dotnet publish ...
Enter fullscreen mode Exit fullscreen mode

Real-World Example

Check out the full build script used by the project itself:

BuildEasyShell.easy

It demonstrates:

  • Path handling and folder creation
  • Running dotnet publish
  • Conditional logic for OS/architecture
  • Creating a dated zip package

This script is self-contained and shows how EasyShell can manage non-trivial automation tasks.

Quick Start

# REPL mode
easy

# Run a script
easy path/to/script.easy

# Help
easy --help
Enter fullscreen mode Exit fullscreen mode

A dedicated VS Code syntax highlighting extension is available: Methodox.easyshell

Who Is It For?

EasyShell is ideal for:

  • Build automation scripts
  • Simple CI/CD glue
  • Daily developer tooling
  • Anyone who wants .NET power without heavy dependency

It's intentionally minimal — no advanced Bash-style features, just the essentials done in a way that’s hard to forget.

Give it a try and let me know what you think!

Top comments (0)